标签:
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 }
运行即可,查看运行结果:
![技术分享](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAqMAAAFUCAIAAACfgqIDAAANn0lEQVR4nO3dvW7j2B2HYV+OLsCt3bswdg1MkcbAAC4mnYuFi3Sp3BpJM1fhYi8iCGBkq1Tp0i0ywADTbO0UsuTDQ/KIsvX58/Pgj4VHpihSGvglKXn25Ndffvr96xdjjDHGvHn++fPPhzCD23ai9MYYY8w7Z++NV3pjjDFmi7P3xiu9McYYM2lmTWP32nvjld4YY4yZNDsu/fPz8/Pzc/sWpTfGGGM2No2cb+mcvkz7ezL/rtI//P3rWrP318mYdefxajY7u3ha+47XD2ez2dWnvW+/WTVeKTN1dl/6ZeDfmfn3lv7f//nv2Pz5L38r/6v0Zgvz6ba4enZ7N/Dd6sbHq9lsdv5YLnZ/cTmbXd5cF4stf/pfP5wdZukHdu3A5/Fq+UKdPtz3nquFxQuxsx1UejN19lL695/Nb6D0T//6beIovdnsPN2cVnV/vKoSMnRGfndelWa+ns5i9xeX783M1vvx1osNK2criX26OV2u8+nmtHwJHq+Kw6ziqGtrO7jrV8rEzMc9pz+ZTOnNJqcX7OG5v7isF/t02zmDv344m93eXFyWJ/oTV96a7fdjYNc2Mts/mW4eSL0Gfls7uPNXyuxv1v303Mq1veFbmzqb3+f79Epv9jHXD2fV9fb6u4vTwf6S1QX5T7ez04f7Tt7Ks8ni65ckvFwDmPXeBbg7f/1BcnVR9+P+4nLojYbqzHXgjy8reX2fYnHfwSehXqx/ZlzcUi9c7Fp5Ib278b3Ne73X2cVTZyXd56f7VKwu/eirXLxlU75M07ek/Ur1NrV6rN7FpE+3s2INI8+V2cv0Ev9is2trr3ODF+3389n7ZennD192vfqj0ptNzoqr692W351XP+ifbk5fb7k7ny9ZXEPunPTXpe++kfz68/3ufFb1e/y7nU8GdK4fzBu2/OP1w9n8Xt1NuhnbtaHF6usTy2OakXX2z+k7a+g8t/PdfFnJsnDloclAQZvn0NVnJnqv3fyZLA9BHu7W3JL2K1U/1viOd4//Vt7FfNh559X7Tc3gtq1R+mXU51+U/1V6s5VZ77puL13FgcLypPnp5nTwonH9M734wV0cMVTvCHzpBqD/3fq+L5t3dz6bnV6elcU6fbhvHNl0d214se6Z8bKdE9f5erQx8OQPXIEowtz97uvH7kYvxswL3UnjwMYMVnnylrRfqfp5G9vx5Xo6R40r7mI+6Oy98RsufXVOX92u9GZjs+YP0OIa+HyW8StCslhn92f3+NlbWeuBahYLDza1OPnrHG3ML0EvLz53Lyf0TxC7uza8WLWeRefG1jlw9NBXHSf1nqvqcTvT/yjl74Ofi+zv4Pi1nKlb0n6l6r9jozteLFD8PVx5F/MhZ++N3+I5ff8IQOnN5mbgLLk1vSODlxLclx/EeynceDO2VfpFhxZnhIut6nwo/WsRkvrXBLoHPf3FOtcGVi086TpB8eSsX/reHV+OOYYfpdzmnZe+FemR0uu6qWbvjd9M6QfP4Mvwz79QerPBGfi1+Nb0Ptt1dz6bnd5endaXfK/Oq0v9k0o/cORRvjfcvnq/iNnd8rBjnvz5RwV7+1K95T/2sbXOYi/LjKa3s3B1wbx1ULWR0j9ezZq/6VDu4OjGTN6S9iv1pbq9/anP3lO65gGo+Riz98ZvrPRTKL3Z6MxPBMtCXD+czf848EmoXnVePr/dy39dnWmlr3NVfc6rvl49VOvbq/PO8menl8VJ+W3njfbevwewOGEdXezufHZ2fnvWOVkfWbjOVb3x9xeXZaSn9vX1sKy7wtV1LF+7/jO57vsIzVeqU/0VOz70t6JxF/NhZ++NV3pz3NP9rbD2Z57rz+XNf8T3P6k3/jtprdIvV7h4a7Z3Tbj8za7eKexAIbr9G/8H5jq7Nr7Y/MimcxVkdOHFpi43oPM8D/8SYPVcLe7VeQdhqdiM4fe2Bza+Ok56sfYxR/uVGnyJ6x2vL0LMd6Eb+/5zZcwBjn/33qRN73N5OTNh147734cJfu2M2eP4f9mZuAn+laeVu3bs+37s22/MQY7SG5MzzomNMf1RemMSZuz31I0xRumNMcaY5FF6Y4wxJnmU3hhjjEkepTfGGGOSR+mNMcaY5FF6Y4wxJnlapf/HX/9kjDHGmGOZt5T+GQDYhx9remPp+/8Dm83uRv9/hjvxLv2F37CR29gjANiI3ZX+uSjiIZS+vfD0lWzv8AUA3m9HpZ8/2PZyqPQAMGj/pR8s5bpX+xulb69k+u1j61F6AA7Znks/Vujl1yfdy/5jxo4MGkcAjRv7t7fXI/MAHKyo0o993TjtVnoAsg3m/PPnz1Gln3jHxu1rrRMADsdg5ucOt/T9E/QppXdOD8AHNJb5sdi/vfQnhXILBm+f8seJJZ7yuP27t2+vnkSlB+BgjZ3Nj8V+//9GnqwCwHT90o/98VBKDwBMV5W+fzFf6QHgiPXfiW870H/3/tB8kN2czrMBsC87Kv3zx/tFtR3s46E9h43t+QivOMBhUvpt2fY+HtpzeGjbA8DcnktfXuWuUjF2qX/d28cMLt94i2HdI5Wx5Tey/pOe9n5NXNXK26c86JTtaS88+CSsu18AzO269I0f7uW3xn7ir/v1FBPXs+5DrLUv71n/lH2ZspJ3Ps/th5u4s9t4fQE+uN/WsbFz+tLJwnOvjqVq+bH1TN/zwfVPLNn0iA6uZOV+TV9/48Y3r6SxnonPz8oHWnf9jecNgLZDKf2UG6csMDED7yzZWhGdeMeNRHojK2msZ+Lzs/KB1l2/ugO82RGUfhtVeNt6Tgrt9Y+tahvr3+Xz0Fj/4PYMPtBmH3fl3k1ceAfLA+zFjko/1rBG29a9S2NVg8qFBys1tqopD1FtSf/rxkreWbI3Pw9T1tN+flauZ8rz3F5s+n6Nbc8elwfYi92d02fY9k925QBgs5R+kjecUB7U+gH4sJQeAJIpPQAkU3oASKb0AJBM6QEgmdIDQDKlB4BkSg8AyZQeAJIpPQAkU3oASKb0AJBM6QEgmdIDQDKlB4BkSg8AyX6sSekB4JgoPQAkU3oASKb0AJBM6QEgmdIDQDKlB4BkSg8AyZQeAJIpPQAkU3oASKb0AJBM6QEgmdIDQDKlB4BkSg8AyZQeAJIpPQAkU3oASKb0AJBM6QEgmdIDQDKlB4BkSg8AyZQeAJIpPQAkU3oASKb0AJBM6QEgmdIDQDKlB4BkSg8AyZQeAJIpPQAkU3oASKb0AJBM6QEgmdIDQDKlB4BkSg8AyZQeAJIpPQAkU3oASKb0AJBM6QEgmdIDQDKlB4BkSg8AyZQeAJIpPQAkU3oASKb0AJBM6QEgmdIDQDKlB4BkSg8AyZQeAJIpPQAkU3oASKb0AJBM6QEgmdIDQDKlB4BkSg8AyZQeAJIpPQAkU3oASKb0AJBM6QEgmdIDQDKlB4BkSg8AyZQeAJIpPQAkU3oASKb0AJBM6QEgmdIDQDKlB4BkSg8AyZQeAJIpPQAkU3oASKb0AJBM6QEgmdIDQDKlB4BkSg8AyZQeAJIpPQAkU3oASKb0AJBM6QEgmdIDQDKlB4BkSg8AyZQeAJIpPQAkU3oASKb0AJBM6QEgmdIDQDKlB4BkSg8AyZQeAJIpPQAkU3oASKb0AJBM6QEgmdIDQDKlB4BkSg8AyZQeAJIpPQAkU3oASKb0AJBM6QEgmdIDQDKlB4BkSg8AyZQeAJIpPQAkU3oASKb0AJBM6QEgmdIDQDKlB4BkSg8AyZQeAJIpPQAkU3oASKb0AJBM6QEgmdIDQDKlB4BkSg8AyZQeAJIpPQAkU3oASKb0AJBM6QEgmdIDQDKlB4BkSg8AyZQeAJIpPQAkU3oASKb0AJBM6QEgmdIDQDKlB4BkSg8AyZQeAJIpPQAkU3oASKb0AJBM6QEgmdIDQDKlB4BkSg8AyZQeAJIpPQAkU3oASKb0AJBM6QEgmdIDQDKlB4BkSg8AyZQeAJIpPQAkU3oASKb0AJBM6QEgmdIDQDKlB4BkSg8AyZQeAJIpPQAkU3oASKb0AJBM6QEgmdIDQDKlB4BkSg8AyZQeAJIpPQAkU3oASKb0AJBM6QEgmdIDQDKlB4BkSg8AyZQeAJIpPQAkU3oASKb0AJBM6QEgmdIDQDKlB4BkSg8AyZQeAJIpPQAkU3oASKb0AJBM6QEgmdIDQDKlB4BkSg8AyZQeAJIpPQAkU3oASKb0AJBM6QEgmdIDQDKlB4BkSg8AyZQeAJIpPQAkU3oASKb0AJBM6QEgmdIDQDKlB4BkSg8AyZQeAJIpPQAkU3oASKb0AJBM6QEgmdIDQDKlB4BkSg8AyZQeAJIpPQAkU3oASKb0AJBM6QEgmdIDQDKlB4BkSg8AyZQeAJIpPQAkU3oASKb0AJBM6QEgmdIDQDKlB4BkSg8AyZQeAJIpPQAkKyv++fPnquv9W5QeAI5J1fUy7dUflR4Ajk+/9PO6l18rPQAcq/7l+pL36QHguPVb3si80gPAkRnM+VjmlR4AjsxY0ZUeABIoPQAkU3oASKb0AJBsR6U3xhhjzLHM2qU3xhhjzLGP0htjjDHJo/TGGGNM8ii9McYYkzxKb4wxxiSP0htjjDHJo/TGGGNM8ii9McYYkzwnv/7ykzHGGGNS5+SPP/748ePH9+/fv3379r9xX79+bXwXADhA3759+z/WGzIcBTpNqgAAAABJRU5ErkJggg==)
这样一个简单的WCF入门程序就完成了!
因为这是我的第一篇,因为我的水平有限,不足之处还望指出,谢谢!!!!
标签:
原文地址:http://www.cnblogs.com/yanneu/p/4700439.html