初识WCF

WCF是对现有分布式通信技术的整合,其中包括Com/DCom、.Net Remoting、Web服务及其WSE(web服务的升级版本)、MSMQ。
.Net Remoting 远程调用,可以实现分布式开发,但是不能跨平台或者说是只能是在.Net和.Net之间进行调用。不能实现真正意义上的面向服务
Web 服务 WSE 可以说是真正意义上的面向服务的设计,可以实现跨平台的调用,但是web服务只能通过http的方式传输,并且安全性、可靠性得不到有效的控制,所以不能完成企业级应用的要求。
MSMQ 是基于Windows的消息队列,它的优点也很多,例如可以支持离线传输、断点传输等。但是只能在同一台服务器或者说是同一台电脑上传输,根本就谈不上分布式。


WCF中的 "A","B","C" 介绍
A(Address):英文理解为"地址",在计算机中是通过一个URI唯一地址标识,通过这个地址我们可以找到我们要调用的WCF服务。
B(Binding):英文理解为"捆绑,绑定", Binding实现在Client和Service通信的所有底层细节。
如:我们在客户端与服务端传输的时候采用的是什么样的编码,XML?Text?二进制?...采用哪
种传输协议进行传输,TCP?Http?以及采用什么样的机制解决安全问题,SSL?加密?...
C(Contract):英文理解为"合同",合同是什么?告诉我们哪些事能做,如些事不能做。
Contract的主要的作用是暴露某个WCF Service所提供的所有有效的方法。
Contract实际上是把每个方法的转化成为相对应的消息。

三、Endpoint(终结点)
WCF实现了网络系统的各个应用程序的通信。各个应用程序的通信是以“终结点(Endpoint)”的来实现的。
我们在上面讲的实际例子中的A、B、C即是Endpoint 的组成部分,他是服务器间通信调用的入口。

四:应用程序间通信
当我们寄宿WCF服务的时候,我们必须定义一个或是多个终结点,然后Serivce端通过监听这些终结点来处理Client发来的请求。
由于应用程序之间是靠Endpoint来通信,那么我们在Client端也必须定义终结点,只有当Client与Service的终结点完全匹配的时候才能进行通信。
不论是在服务端还是在客户端,endpoint中的A、B、C都是完全一样的。也就是终结点完全匹配!

WCF服务应用程序与WCF服务库
WCF服务应用程序,是一个可以执行的程序,它有独立的进程,WCF服务类契约的定义,可以直接看到运行的效果。
WCF服务库,可以认为是一个包含WCF服务以及契约定义的类库。不能直接运行,你可以在其他项目里引用,在宿
主里启用托管这个库,有点类似于我们在Web项目中应用的类库

WCF的宿主可以是 Windows 服务、COM+应用程序、WAS(Windows Activation Services,Windows进程激活服务)
或IIS、Windows应用程序,或简单的控制台应用程序及任何.net程序。

控制台应用程序宿主
  建立宿主
  (1)在解决方案下新建控制台输出项目 WCFHost_Console。
  (2)添加 System.ServiceModel.dll 的引用。
  (3)添加 WCF 服务类库(WCFLibrary)的项目引用。
  (4)创建宿主程序,代码如下:

 1 using System;
 2 using WCFLibrary;
 3 using System.ServiceModel;
 4 using System.ServiceModel.Description;
 5 namespace WCFHost_Console
 6 {
 7     class Program
 8     {
 9         static void Main(string[] args)
10         {
11             //创建宿主的基地址
12             Uri baseAddress = new Uri("http://localhost:8080/User");
13             //创建宿主
14             using (ServiceHost host = new ServiceHost(typeof(User), baseAddress))
15             {
16                 //向宿主中添加终结点
17                 host.AddServiceEndpoint(typeof(IUser), new WSHttpBinding(), "");
18                 //将HttpGetEnabled属性设置为true
19                 ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
20                 smb.HttpGetEnabled = true;
21                 //将行为添加到Behaviors中
22                 host.Description.Behaviors.Add(smb);
23                 //打开宿主
24                 host.Open();
25                 Console.WriteLine("WCF中的HTTP监听已启动....");
26                 Console.ReadLine();
27                 host.Close();
28             }
29         }
30     }
31 }

Windows应用程序宿主
建立宿主
  (1)在解决方案下新建Windows窗体应用程序项目 WCFHost_Form。
  (2)添加 System.ServiceModel.dll 的引用。
  (3)添加 WCF 服务类库(WCFLibrary)的项目引用。
  (4)添加应用程序配置文件App.config。
  (5)创建宿主程序MainForm窗体,并修改App.config,代码如下
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="WCFLibrary.User">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8081/User"/>
</baseAddresses>
</host>
<endpoint address="" binding="wsHttpBinding" contract="WCFLibrary.IUser"></endpoint>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>

using System;
using WCFLibrary;
using System.ServiceModel;
using System.Windows.Forms;
using System.Configuration;
namespace WCFHost_Form
{
    public partial class MainForm : Form
    {
        ServiceHost host;

        public MainForm()
        {
            InitializeComponent();
        }

        //应用程序加载
        private void MainForm_Load(object sender, EventArgs e)
        {
            host = new ServiceHost(typeof(User));
            //打开宿主
            host.Open();
            this.lblState.Text = "WCF中的HTTP监听已启动....";
        }

        //应用程序关闭
        private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            host.Close();
        }
    }
}

WAS宿主
IIS7允许通过HTTP外的协议进行激活和网络通信。此环境适合开发可通过WCF支持的任何网络协议(包括http、net.tcp、net.pipe、net.msmq)进行通信的WCF服务。部署简单、管理方便,
这些网络协议在部署时可像Http一样,直接丢到IIS7上即可,我们在下面的例子中以net.tcp为协议为例。IIS7以下的版本只能支持Http的通信。

wcf 文件配置:
<?xml version="1.0"?>
<configuration>
<system.serviceModel>
<!--服务-->
<services>
<!--name:名称空间.类型名-->
<!--behaviorConfiguration:behavior的名称,请看behavior配置节的名称-->
<service name="WCFLibrary.User" behaviorConfiguration="MyBehavior">
<host>
<baseAddresses>
<!-- 每种传输协议的baseAddress,用于跟使用同样传输协议Endpoint定义的相对地址组成完整的地址,
每种传输协议只能定义一个baseAddress。HTTP的baseAddress同时是service对外发布服务说明页面的URL -->
<add baseAddress="http://localhost:8732/Design_Time_Addresses/WCFLibrary/Service/"/>
</baseAddresses>
</host>
<!-- 除非完全限定,否则地址将与上面提供的基址相关,每个服务可以有多个Endpoint -->
<!-- Address:指定这个Endpoint对外的URI,这个URI可以是个绝对地址,也可以是个相对于baseAddress的
相对地址。如果此属性为空,则这个Endpoint的地址就是baseAddress-->
<!--bindingConfiguration:binding的名称,请看binding配置节的名称-->
<endpoint address="" binding="wsHttpBinding" contract="WCFLibrary.IUser" bindingConfiguration="myHttpBinding">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<!-- 此终结点不使用安全绑定,应在部署前确保其安全或将其删除-->
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<!--绑定-->
<bindings>
<wsHttpBinding>
<binding name="myHttpBinding">
<security mode="None">
<message clientCredentialType="Windows" />
</security>
</binding>
</wsHttpBinding>
</bindings>

<!--行为-->
<behaviors>
<serviceBehaviors>
<behavior name="MyBehavior">
<!-- httpGetEnabled - bool类型的值,表示是否允许通过HTTP的get方法获取sevice的WSDL元数据 -->
<serviceMetadata httpGetEnabled="True"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>

WCF在通信过程中有三种模式:请求与答复、单向、双工通信。以下我们一一介绍。
请求与答复模式:客户端发送请求,然后一直等待服务端的响应(异步调用除外),期间处于假死状态,直到服务端有了答复后才能继续执行其他程序,
请求与答复模式为WCF的默认模式
单向模式:
客户端向服务端发送求,但是不管服务端是否执行完成就接着执行下面的程序。[OperationContract(IsOneWay = true)]

双工模式:
双工模式建立在上面两种模式的基础之上,实现客户端与服务端相互的调用。相互调用
支持回调的绑定有4种:WSDualHttpBinding、NetTcpBinding、NetNamedPipeBinding、NetPeerTcpBinding