WCF练习小程序总结

1、什么是WCF

严格的说,WCF就是专门用于服务定制、发布与运行以及消息传递和处理的一组专门类的集合,也就是所谓的“类库”。这些类通过一定方式被组织起来,共同协 作,并为开发者提供了一个统一的编程模式。WCF之所以特殊,是在于它所应对的场景与普通的.NET类库不同,它主要用于处理进程间乃至于机器之间消息的 传递与处理,同时它引入了SOA的设计思想,以服务的方式公布并运行,以方便客户端跨进程和机器对服务进行调用。实际上,WCF就是微软对于分布式处理的 编程技术的集大成者,它将DCOM、Remoting、Web Service、WSE、MSMQ集成在一起,从而降低了分布式系统开发者的学习曲线,并统一了开发标准。

2、WCF服务需要依存一个运行着的进程(宿主),服务寄宿就是为服务指定一个宿主的过程。WCF是一个基于消息的通信框架,采用基于终结点(Endpoint)的通信手段。终结点由地址(Address)、绑定(Binding)和契约(Contract)三要素组成。Address是Endpoint的网络地址,它标记了消息发送的目的地。Binding描述的是如何发送消息,例如消息发送的传输协议(如 TCP,HTTP),安全(如SSL,SOAP消息安全)。Contract则描述的是消息所包含的内容,以及消息的组织和操作方式,例如是单向,双向还 是请求/响应方式。服务寄宿的目的就是开启一个进程,为WCF服务提供一个运行的环境。通过为服务添加一个或多个终结点,使之暴露给潜给的服务消费者。服务消费者最终通过相匹配的终结点对该服务进行调用。我们可以完全通过代码的方式完成所有的服务寄宿工作,也可以在配置文件中配置。项目中一般都会使用配置文件进行管理。

<?xml version="1.0" encoding="utf-8"?>
<!--服务端配置-->
<configuration>
  <system.serviceModel>
    <services>
      <service name="WcfService1.Service1">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8098/Service1"/>
          </baseAddresses>
        </host>
        <endpoint address="" binding="wsHttpBinding" contract="WcfService1.IService1"></endpoint>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="False"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

<!--客户端配置-->
<!--<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <bindings>
            <wsHttpBinding>
                <binding name="WSHttpBinding_IService1" />
            </wsHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:8098/Service1" binding="wsHttpBinding"
                bindingConfiguration="WSHttpBinding_IService1" contract="ServiceReference1.IService1"
                name="WSHttpBinding_IService1">
                <identity>
                    <userPrincipalName value="lining@shanghai3h.com" />
                </identity>
            </endpoint>
        </client>
    </system.serviceModel>
</configuration>-->
        static void Main(string[] args)
        {
             //创建宿主的基地址
            Uri baseAddress = new Uri("http://localhost:8098/Service1");
             //创建宿主
             using (ServiceHost host = new ServiceHost(typeof(Service1), baseAddress))
             {
                 //向宿主中添加终结点
                 host.AddServiceEndpoint(typeof(IService1), new WSHttpBinding(), "");
                 //将HttpGetEnabled属性设置为true
                 ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                 smb.HttpGetEnabled = true;
                 //将行为添加到Behaviors中
                 host.Description.Behaviors.Add(smb);
                 //打开宿主
                 host.Open();
                 Console.WriteLine("WCF中的HTTP监听已启动....");
                 Console.ReadLine();
                 host.Close();
             }
        }

 3、WCF的典型宿主包括以下四种:
(1)、"Self-Hosting" in a Managed Application(自托管宿主)(2)、Managed Windows Services(Windows Services宿主)(3)、Internet Information Services(IIS宿主)(4)、Windows Process Activation Service(WAS宿主)

4、我做的小程序就是按照网上的例子(我的第一个WCF程序)做的,例子很简单,可能需要注意一下几点:

(1)、含有WCF服务的程序在运行时会报错(权限不足),这时候需要以管理员方式运行
(2)、常用的序列化和反序列化有三种:XML、Binary、Soap,它的作用主要是为了在进程或机器间进行数据的传递与交互
(3)、WCF中被[DataMember]修饰的属性必须同时具备get和set方法
(4)、XmlSerializer类在System.Xml命名空间下,这个类可以系列化那些即使没有添加[Serializable]特性的类型
(5)、配置文件中address="http://localhost:8098/Service1"的端口号 与 wcf服务属性中特定端口必须不同!!

原文地址:https://www.cnblogs.com/len0031/p/4152611.html