标签:
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。
这里我带领大家一步一步来完成这个程序
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 IData 14 { 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 : IData 11 { 12 public string WCFHello(string name) 13 { 14 return string.Format("{0},Hello!", name); 15 } 16 } 17 }
运行该程序,一定要记得运行Client端时必须保证Service运行,这时我们打开Web.config文件
<?xml version="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 Program 11 { 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看看:
<?xml version="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 Client 10 { 11 class Program 12 { 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入门程序就完成了!
因为这是我的第一篇,因为我的水平有限,不足之处还望指出,谢谢!!!!
标签:
原文地址:http://www.cnblogs.com/yanneu/p/4700439.html