你的位置:首页 > ASP.net教程

[ASP.net教程]学习WCF入门的第一个实例


   一、概述

      WCF说白了就是一个基于终结点的通信手段!就是Service端提供一定的功能实现,然后暴露出一个或多个终结点,Client端调用Service端的功能(可以理解为调用一个函数),那么Client端是通过何种方式来匹配呢?就是通过匹配Service端暴露出的终结点,既然是匹配,那就说明终结点有一定的属性,这就是我们说的ABC:

      A=address(地址)

      B=Binding(绑定)

      C=Contract(契约)

      怎么来让大家更通俗的了解ABC呢?这里我引用园里的一位老师的的一个例子:

      有两个城市A、B,假设A市的快递需要去B市领,这里涉及到三个方面的问题:你首先必须知道B的地址(address)对吧,没地址你是根本去不了的,有了地址,那你要怎么去B市,你可以打车去,走路去等等,方式有很多种,但你必须要一交通方式前往B市,这个方式就是Binding,当你到了B市取快递的地方,难道你可以直接把快递拿走吗?显然不行,你必须和快递公司对上货物信息对方才会给你,这个用来匹配的信息就是Contract。

二、一个非常简单的WCF程序

       这里我带领大家一步一步来完成这个程序

      1、首先我们新建一个空白的解决方案MyWCF(新建项目-》其他项目类型-》Visual Studio解决方案-》空白解决方案)这里我们用的是VS2013

      

      2、 然后右键点击解决方案,添加一个控制台应用程序,命名为Service:

      

      3、右键点击控制台程序Service,添加一个WCF服务,命名为Data

     

      这里将生成Data.cs,IData.cs文件

      4、点开IData.cs文件,写一个接口(契约)文件

   

 1 using System.Collections.Generic; 2 using System.Linq; 3 using System.Runtime.Serialization; 4 using System.ServiceModel; 5 using System.Text; 6  7 namespace Service 8 { 9   /// <summary>10   /// 用ServiceContract来标记此接口是服务契约11   /// </summary>12   [ServiceContract]13   public interface IData14   {15     /// <summary>16     /// 用OperationContract来标记此方法为操作契约17     /// </summary>18     [OperationContract]19     string WCFHello(string name);20   }21 }

 

    5、点开Data.cs文件,实现接口,即实现契约

 1 using System.Collections.Generic; 2 using System.Linq; 3 using System.Runtime.Serialization; 4 using System.ServiceModel; 5 using System.Text; 6  7 namespace Service 8 { 9   // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“Data”。10   public class Data : IData11   {12     public string WCFHello(string name)13     {14       return string.Format("{0},Hello!", name);15     }16   }17 }

     运行该程序,一定要记得运行Client端时必须保证Service运行,这时我们打开Web.config文件

<?"1.0" encoding="utf-8" ?><configuration>  <startup>     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />  </startup>  <system.serviceModel>    <behaviors>      <serviceBehaviors>        <behavior name="">          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />          <serviceDebug includeExceptionDetailInFaults="false" />        </behavior>      </serviceBehaviors>    </behaviors>    <services>      <service name="Service.Data">        <endpoint address="" binding="basicHttpBinding" contract="Service.IData">          <identity>            <dns value="localhost" />          </identity>        </endpoint>        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />        <host>          <baseAddresses>            <add baseAddress="http://localhost:8733/Design_Time_Addresses/Service/Data/" />          </baseAddresses>        </host>      </service>    </services>  </system.serviceModel></configuration>

 将下划线的这个地址复制,因为在Client端需要
6、打开Program.cs文件,在这里因为你要使用ServiceHost类,则必须引用其命名空间using System.ServiceModel(添加引用的方法:右键点击“引用”
-》添加引用-》框架-》System.ServiceModel-》确定,当ServiceHost显示错误时,把光标放在上面当显示using细节时直接添加
关于ServiceHost类的详细信息可以访问微软https://msdn.microsoft.com/zh-cn/library/system.servicemodel.servicehost.aspx
 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.ServiceModel; 5 using System.Text; 6 using System.Threading.Tasks; 7  8 namespace Service 9 {10   class Program11   {12     static void Main(string[] args)13     {14       //定义一个ServiceHost类实例,ServiceHost类提供服务的主机15       //注意参数中要使用契约实现类而不是接口,注意!!!!16       using (ServiceHost host=new ServiceHost (typeof (Service.Data )))17       {18         host.Open();19         Console.WriteLine("Service Running...");20         Console.ReadKey();21         host.Close();22       }23     }24   }25 }

    运行该程序,生成.exe文件,不用关闭

 

  7、接下来就是创建Client端,新建一个控制台应用程序(不是在之前的解决方案下,而是另外建一个),命名为Client

      首先必须先添加服务引用(右键“引用”-》添加服务引用-》输入之前复制的address,并修改命名空间为HelloWCF(命名随意),如图

    

 这个时候我们可以打开App.config看看:
<?"1.0" encoding="utf-8" ?><configuration>  <startup>     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />  </startup>  <system.serviceModel>    <bindings>      <basicHttpBinding>        <binding name="BasicHttpBinding_IData" />      </basicHttpBinding>    </bindings>    <client>      <endpoint address="http://localhost:8733/Design_Time_Addresses/Service/Data/"        binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IData"        contract="HelloWCF.IData" name="BasicHttpBinding_IData" />    </client>  </system.serviceModel></configuration>

   打开Program.cs,添加引用using System.ServiceModel和using System.ServiceModel.Channels,方法和之前的一样

 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.ServiceModel; 5 using System.ServiceModel.Channels; 6 using System.Text; 7 using System.Threading.Tasks; 8  9 namespace Client10 {11   class Program12   {13     static void Main(string[] args)14     {15       //这里的"BasicHttpBinding_IData"正是我们之前打开的App.config里的name="BasicHttpBinding_IData"16       //ChannelFactory的类型也是contract="HelloWCF.IData"17       var proxy = new ChannelFactory<HelloWCF.IData>("BasicHttpBinding_IData").CreateChannel();18       Console.WriteLine(proxy.WCFHello("Tom"));19       ((IChannel)proxy).Close();20     }21   }22 }

 

运行即可,查看运行结果:



这样一个简单的WCF入门程序就完成了!
因为这是我的第一篇,因为我的水平有限,不足之处还望指出,谢谢!!!!