zoukankan      html  css  js  c++  java
  • WCF简单应用总结 by Jimmyzzc

    在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服务了。

  • 相关阅读:
    透视校正插值
    投影矩阵推导
    编程思想-小即是美
    Win10使用小技巧
    TotalCommander 之 快捷键
    TotalCommander 之 配置
    TotalCommander 之 日常使用技巧
    上士闻道,勤而行之;中士闻道,若存若亡;下士闻道,大笑之。不笑不足以为道。
    《诫子书》
    青春不是年华,而是心境
  • 原文地址:https://www.cnblogs.com/shanhe/p/4092362.html
Copyright © 2011-2022 走看看