在VS2013里建立一个最简单的WCF服务,基本流程如下:
一:新建WCF应用
二、WCF应用中的契约(Contract)
1 [DataContract] 2 public class 自定义属性 3 { 4 [DataMember] 5 public System.Guid Id { get; set; } 6 [DataMember] 7 public string Key { get; set; } 8 [DataMember] 9 public string Value { get; set; } 10 [DataMember] 11 public int OrderId { get; set; } 12 }
以上是WCF的一个实体模型,如果class想要在引用WCF服务的其它程序里使用,则需要在类的上方加入[DataContract]关键字,并引用using System.Runtime.Serialization;命名空间。此处表示该类定义了契约。若类中的属性需要被其它程序调用,需要加上[DataMember]。
下面的实体类的声明方式有所不同,下面详细讲解。
1 [DataContract(IsReference = true)] 2 [KnownType(typeof(产品))] 3 [KnownType(typeof(成品))] 4 [KnownType(typeof(定制))] 5 [KnownType(typeof(基础材料))] 6 public class 商品 7 { 8 public 商品() 9 { 10 this.单位值 = 0m; 11 this.商品自定义属性集 = new List<自定义属性>(); 12 this.价格方案集 = new List<价格方案>(); 13 } 14 [DataMember] 15 public 产品 产品信息 { get; set; } 16 [DataMember] 17 public System.Guid Id { get; set; } 18 [DataMember] 19 public string 商品编号 { get; set; } 20 [DataMember] 21 public string 名称 { get; set; } 22 [DataMember] 23 public string 描述 { get; set; } 24 [DataMember] 25 public string 图片集 { get; set; } 26 [DataMember] 27 public virtual IEnumerable<价格方案> 价格方案集 { get; set; } 28 [DataMember] 29 public virtual IEnumerable<自定义属性> 商品自定义属性集 { get; set; } 30 }
[DataContract(IsReference = true)]这个关键字也是起到契约的作用,IsReference = true
是表示该类有导航属性(本项目的数据是用EF5.0开发,故有导航属性,何为导航属性请自行查阅EF相关知识),并与导航属性之间可以相互引用,如果不加此关键字,服务会报错(类似为死循环)。价格方案集、商品自定义属性集都是属性。[KnownType(typeof(定制))]代表类之间的继承关系,就是说定制类是继承于商品这个类的。如果不加此关键字,服务发布之后会在服务中看不到定制这个类型。
三、WCF应用中的服务功能实现(ServiceBehavior)
首先在实现业务之前要定义好方法接口
1 public interface I同步供应商物料 2 { 3 Model.产品关系 Get同步_产品关系(Guid 产品关系Id); 4 List<Guid> Get待同步_全部产品关系Id集(int 页号, int 页数, out int 记录数, string 供应商编号, DateTime 最后更新时间); 5 }
此处应该注意,如果返回的对象为泛型。要用List<>来声明,不能用IEnumerable<>,因为本人在调试过程中最开始用的是IEnumerable<>,结果程序不断的报错,困扰了一天最后无处可改的时候改成了List<>结果就好了。后来查资料好像是因为WCF中某些类型是不可以序列化的。
下面是实现接口的过程:
1 [ServiceContract] 2 public class 设计中心同步服务 : I同步供应商物料, I同步供应商指定时间物料 3 { 4 [OperationContract] 5 public List<Guid> Get待同步_全部产品Id集(int 页号, int 页数, out int 记录数, string 供应商编号, DateTime 最后更新时间) 6 { 7 using (var db商品 = new 商品.WCF外部服务()) 8 { 9 return db商品.Get待同步_全部产品Id集(页号, 页数, out 记录数, 供应商编号, 最后更新时间).ToList(); 10 } 11 } 12 [OperationContract] 13 public Model.产品 Get同步_产品(Guid 产品Id) 14 { 15 using (var db商品 = new 商品.WCF外部服务()) 16 { 17 产品 model产品 = db商品.Get同步_产品(产品Id); 18 return Fill同步产品(model产品); 19 } 20 } 21 }
[ServiceContract]为实现方法的类在引用时候可以调用,[OperationContract]是该类里的方法也可以在其它引用中调用。
三、WCF应用的配置文件以及发布
服务的配置文件都在webconfig这个文件下。系统会生成一些代码,但主要的是:
1 <system.serviceModel> 2 <bindings> 3 <basicHttpBinding> 4 <binding name="BasicHttpBinding_supplier" /> 5 </basicHttpBinding> 6 </bindings> 7 <client> 8 <endpoint address="http://192.168.3.227:7788/设计中心同步服务.svc" binding="basicHttpBinding" 9 bindingConfiguration="BasicHttpBinding_supplier" contract="六月版.供应商.WCF服务.外部服务.设计中心同步服务" 10 name="BasicHttpBinding_supplier" /> 11 </client> 12 </system.serviceModel>
<basicHttpBinding>定义了服务的发布绑定方式,有很多种。目前讨论两种BasicHttpBinding和WsHttpBinding。WsHttpBinding支持WS- Security specifications,WS-Security specifications具有扩展web service的能力。两者之间最大的不同那就是安全。默认情况下,BasicHttpBinding发送的是明文数据,而 WsHttpBinding发送的是加密和更加安全的数据。如果你希望有向后兼容的能力,并且支持更多的客户端,你可以选择basicHttpBinding,如果你确定你的客户端使用的是.NET 3.0甚至更高的话,你可以选择wsHttpBinding。
<endpoint>是终节点的意思。包括发布后的服务地址和行为,行为绑定的名称就是发布绑定的名称。都配置完成后,VS中按着一步步提示发布即可。
其它程序可以通过终节点配置的IIS地址来添加服务引用,就可以用到封装好的WCF服务了。