嘻嘻哈,其实学习wcf纯属意外,因为当时是想看一下wpf,结果很不小心搜成了wcf(不知道当时心里怎么想的手给打错了),因为已经了去了解了wcf并且google了一些资料,心想既来之则安之,便整理了一些基本的笔记,写出来顺便就当理整理一下我的思路了。也可以给wcf想入门的同志们一点点参考。
wcf是做什么的,网上讲解很多,我就不多说了,我只想把我的第一个wcf代码程序展示出来,并且会附上详细注释。因为我的工作一直是做winform程序的,所以,该程序的服务器端和客户端均使用控制台应用程序进行开发。
wcf是具体的开发流程,msdn上解释是分为六部:
1,定义 Windows Communication Foundation 服务协定,说白了也就是我们通常所说的接口(intferface),只是比平时的接口多了几个属性。如下:
/// <summary> /// 这些属性的命名空间为using System.ServiceModel /// 该程序集一般情况下在C:\WINDOWS\Microsoft.NET\Framework\v3.0\Windows Communication Foundation文件中 /// </summary> [ServiceContract] //服务协定 public interface IHelloWordWCF { [OperationContract] //数据协定,改属性表明,改服务会公开此方法,也就说客户端可以调用到 void Writer(string name); [OperationContract] string DoSome(); void S(); //无协定,客户端将无法调用 }
怎么样,定义一个协议简单吧,那就进行第二步
2,实现 Windows Communication Foundation 服务协定,其实也就是定义一个继承自刚才我们定义的协定(IHellowWordWCF)的类
/// <summary> /// 实现改协定 /// </summary> public class HelloWordWCF:IHelloWordWCF { #region IHelloWordWCF 成员 public void Writer(string name) { Console.WriteLine(name); Console.ReadLine(); } public string DoSome() { return "yangyang"; } public void S() { } #endregion }
这不,就实现了协定,在接口方法中可以写需要实现的功能,下一步就没这么常见了。
3,承载和运行基本的 Windows Communication Foundation 服务,也就是说,你刚才实现了协定的服务,那么,还得去承载运行发布呢。以方便客户端的调用。
//定义一个基址。以方便客户端寻址。该URI指定HTTP方案、地计算机、端口号 8080 static Uri uri = new Uri("http://localhost:8080/yangyang"); static void Main(string[] args) { //创建Service实例承载服务 //HelloWordWCF:承载服务的基本协定。 //uri:包含承载服务的基址 using (ServiceHost host = new ServiceHost(typeof(HelloWordWCF), uri)) { try { //加载该服务的终结点, host.AddServiceEndpoint(typeof(IHelloWordWCF), new WSHttpBinding(), "HelloWordWCF"); //控制服务元数据和相关信息的发布。 发布服务了 ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); smb.HttpGetEnabled = true; //元数据以使用 HTTP/GET 请求进行检索。 host.Description.Behaviors.Add(smb); host.Open(); Console.Write("The Service address is {0}", uri); Console.ReadLine(); host.Close(); } catch (CommunicationException ex) //表示服务或客户端应用程序中的通信错误。 { throw; } } }
好了,至此,我们的超级超级简单的服务器端的编码算是完成了,编译成功后,调试-启动新实例。在浏览器中输入刚才定义的基址http://localhost:8080/yangyang,效果如下,
然后呢,我们打开vs的命令提示,输入“WcfTestClient”,然后回车,弹出如下窗体,输入我们的服务基址,就可以测试我们的服务是否可以正常工作了。如下图
如果测试通过,恭喜了,我们的服务器端已经建立起来了,现在,我们就需要实现我们的客户端了。也就是我们的第四步;
4,创建 Windows Communication Foundation 客户端
建了项目,我们首先引用using System.ServiceModel
我们需要命令行工具 ServiceModel 元数据实用工具 (Svcutil.exe)帮我们生成服务器代码文件和配置文件,如下图所示
如图,首先执行红下滑线的命令,后面是我们服务的基址,然后回车,就会在蓝色下划线的目录生成这两个文件,我们需要在客户端添加现有文件,将这两个文件进行添加,generatedProxy.cs是服务文件的代码,使我们可以访问服务器的接口方法,app.config中,是生成服务器端的一些配置。接下来的第五步
5,配置基本 Windows Communication Foundation 客户端,第五步吧,其实是做一些总结点的配置,因为我这个演示是比较简单的,没有做繁杂的操作,所以,我就原本原样的使用svcutil.exe生成的配置,蓝色圈出的地方是服务代码中的终结点的名称,我们需要记录一下。
呵呵,这时候如果一切顺利,马上就要成功了,最后一步了
6,使用 Windows Communication Foundation 客户端
代码如下
static void Main(string[] args) { //使用刚才记录终结点的名称,初始化一个服务协定的实体 HelloWordWCFClient client = new HelloWordWCFClient("WSHttpBinding_IHelloWordWCF"); Console.WriteLine(client.DoSome()); //呵呵,我承认我的设计有点扯淡,协定中DoSome()中返回了“yangyang”这个字符串。 Console.ReadLine(); }
ok,一个简单的wcf程序就好了,现在,在文件夹中找出我们的服务端的程序,在bin-debug中编译好的Service.exe。然后,调试我们的客户端,结果如下图
这个时候我们的客户端已经成功调用了服务器端的方法。
我列出我的项目结构图:
所有的代码都在服务协定,接口都在programs里面写着。客户端蓝色圈出部分是svcutil.exe生成的。两个项目都需要添加syste.ServiceModel程序集。
哪里写的不对,还请读者体谅一下,wcf的新手拉。嘻嘻