这篇博客将介绍WCF的最基础内容,让我们对WCF有一个基本的认识。后续的博客中将会介绍WCF其他方面内容。本篇博客将通过一个简单的例子,介绍如何创建WCF服务,并承载这个服务,让客户端来访问它。下面请看项目结构。
Client与Hosting是控制台程序,Hosting工程需要添加Contract,Service工程和System.ServiceModel名称空间。Contract工程是类库工程,需要添加System.ServiceModel名称空间,Service工程也是类库工程,需要添加Contract工程引用和System.ServiceModel名称空间。
在Contract类库中添加ICalculateService接口,
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.ServiceModel; namespace Contract { [ServiceContract] public interface ICalculateService { [OperationContract] double Add(double x, double y); [OperationContract] double Subtract(double x, double y); [OperationContract] double Divide(double x, double y); [OperationContract] double Multiply(double x, double y); } }
在Service类库中新建CalculateService类,实现ICalculateService方法。
using Contract; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Service { public class CalculateService : ICalculateService { public double Add(double x, double y) { return x + y; } public double Divide(double x, double y) { return x / y; } public double Multiply(double x, double y) { return x * y; } public double Subtract(double x, double y) { return x - y; } } }
此时WCF服务的契约和实现已经完成了,下面对这个服务进行承载,对WCF的承载有很多种方式,这篇博客介绍通过Console程序和IIS来承载WCF服务。
1. 通过Hosting控制台程序来承载。需要在配置文件(app.config/web.config)中添加服务的终结点,
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /> </startup> <system.serviceModel> <services> <service name="Service.CalculateService" behaviorConfiguration="CalculateServiceBehavior"> <endpoint address="" binding="basicHttpBinding" contract="Contract.ICalculateService"> <identity> <dns value="localhost"/> </identity> </endpoint> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> <host> <baseAddresses> <add baseAddress="http://192.168.1.104/CalculateService"/> </baseAddresses> </host> </service> </services> <behaviors> <serviceBehaviors> <behavior name="CalculateServiceBehavior"> <serviceDebug includeExceptionDetailInFaults="true"/> <serviceMetadata httpGetEnabled="true"/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
承载服务
using (ServiceHost host = new ServiceHost(typeof(CalculateService))) { host.Opened += delegate { Console.WriteLine("Service is opened."); }; host.Open(); Console.ReadKey(); }
运行Hosting程序,在浏览器中访问配置文件中服务的地址,
这就说明我们的服务已经部署成功,下面可以来引用服务,并调用服务公开的方法。
在Client工程右击选择Add Service References
输入服务地址,点击Go,可以找到我们已经部署的服务。
我个人比较喜欢通过SvcUtil命令生成Service的客户端代理类,打开Developer Command prompt for VS2015工具,输入SvcUtil /out:D:\CalculateServiceProxy.cs /config:D:\app.config http://192.168.1.104/CalculateService
直接通过命令行方式生成代理类很简洁,也便于在团队开发中控制(个人观点)。
将生成的CalculateServiceProxy类拷贝到Client工程下Services目录中,替换Client工程中App.config文件内容。下面对服务进行调用,
using (CalculateServiceClient proxy = new CalculateServiceClient()) { Console.WriteLine(proxy.Add(2,3)); Console.WriteLine(proxy.Divide(2, 3)); Console.WriteLine(proxy.Multiply(2, 3)); Console.WriteLine(proxy.Subtract(2, 3)); Console.ReadKey(); }
2. 通过IIS来承载WCF服务,我们只需要做一点点的改变即可,再新建一个类库工程叫IISHosting,引用Contract,Service两个类库,添加一个配置文件叫Web.config, 将上面配置文件的内容复制到Web.config中,删除host节点的内容,再新建一个叫做CalculateService.svc文件,添加如下代码:
<%@ ServiceHost Service="Service.CalculateService" Language="C#" %>
编译类库工程,新建一个文件夹叫做CalculateService,将Web.config, CalculateService.svc文件放在里面,另外在文件夹中新建bin文件夹,将编译后Debug目录下Contract.dll, Service.dll拷贝到其中。
打开IIS控制台,在默认站点下新建一个程序叫做CalculateService,虚拟目录指向新建的CalculateService文件夹地址。
注意因为我是基于.NET 4.5.2的环境开发的WCF服务,所以请将Application Pool选择为ASP.NET 4.0模式。通过浏览器访问WCF服务,
服务的调用和上面的控制台承载方式一致。代码点击这里下载。
感谢您的阅读!