wcf是微软开发出的用户数据通信的app接口,在.net framework3.0中与wpf,wf一同集成,是.net框架的一部分。
具体请参见点击打开链接。
本文主要讲述了使用wcf服务契约来进行文件或者数据的服务器上传或者下载工作,使用的工具为vs2012(使用过程中发现了不少bug)。WCF是以契约来规定通信双方的沟通协议。双方必须定义相同的协议绑定才能实现沟通。本文使用基本的http支持,也就是basicHttpBinding。看具体步骤
1:搭建服务器,添加ServiceFile.svc文件
添加成功后,会在项目中增加一个该服务类对应的一个接口,IServiceFile,这个接口中定义的未实现方法就是将来要实现的服务代码,也是契约的定义声明,这里使用操作契约。
定义的接口代码:
// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IServiceFile”。
[ServiceContract]
public interface IServiceFile
{
/// <summary>
/// 上传操作
/// </summary>
/// <param name="fileInfo"></param>
/// <returns></returns>
[OperationContract]
CustomFileInfo UpLoadFileInfo(CustomFileInfo fileInfo);
/// <summary>
/// 获取文件操作
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
[OperationContract]
CustomFileInfo GetFileInfo(string fileName);
}
/// <summary>
/// 自定义文件属性类
/// </summary>
[DataContract]
public class CustomFileInfo
{
/// <summary>
/// 文件名称
/// </summary>
[DataMember]
public string Name { get; set; }
/// <summary>
/// 文件大小
/// </summary>
[DataMember]
public long Length { get; set; }
/// <summary>
/// 文件偏移量
/// </summary>
[DataMember]
public long OffSet { get; set; }
/// <summary>
/// 发送的字节
/// </summary>
[DataMember]
public byte[] SendByte { get; set; }
}
ServiceInfo.svc实现:
// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“ServiceFile”。
// 注意: 为了启动 WCF 测试客户端以测试此服务,请在解决方案资源管理器中选择 ServiceFile.svc 或 ServiceFile.svc.cs,然后开始调试。
public class ServiceFile : IServiceFile
{
public CustomFileInfo UpLoadFileInfo(CustomFileInfo fileInfo)
{
// 获取服务器文件上传路径
string fileUpLoadPath = System.Web.Hosting.HostingEnvironment.MapPath("~/UpLoadFile/");
// 如需指定新的文件夹,需要进行创建操作。
Console.WriteLine("1");
// 创建FileStream对象
FileStream fs = new FileStream(fileUpLoadPath + fileInfo.Name, FileMode.OpenOrCreate);
Console.WriteLine("2");
long offSet = fileInfo.OffSet;
// 使用提供的流创建BinaryWriter对象
var binaryWriter = new BinaryWriter(fs, Encoding.UTF8);
binaryWriter.Seek((int)offSet, SeekOrigin.Begin);
binaryWriter.Write(fileInfo.SendByte);
fileInfo.OffSet = fs.Length;
fileInfo.SendByte = null;
binaryWriter.Close();
fs.Close();
Console.WriteLine("2");
return fileInfo;
}
public CustomFileInfo GetFileInfo(string fileName)
{
string filePath = System.Web.Hosting.HostingEnvironment.MapPath("~/UpLoadFile/") + fileName;
if (File.Exists(filePath))
{
var fs = new FileStream(filePath, FileMode.OpenOrCreate);