wcf入门笔记一
WCF 是用于构建面向服务的应用程序的框架,服务即一组API,宿主程序(可以使应用程序,也可也是IIS)公开一组API给客户程序调用,WCF主要有三个步骤:
一、创建服务协定
创建基本 WCF 服务时,第一项任务是定义协定。协定指定服务支持的操作。可以将操作视为一个 Web 服务方法。通过定义 C++、C# 或 VB
接口可创建协定。接口中的每个方法都对应于特定的服务操作,每个接口都必须应用ServiceContract属性,接口中的每个操作必须应用OperationContract属性。新建一个dll,首先应引用System.ServiceModel.dll,它包含了ServiceContract和OperationContract属性及其它一些WCF的一些基本功能。
namespace Microsoft.ServiceModel.Samples { using System.ServiceModel; [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")] public interface ICalculator { [OperationContract] int Add(int a, int b); } }
二、实现服务协定
1 namespace Microsoft.ServiceModel.Samples 2 { 3 4 public class CalculatorService : ICalculator 5 { 6 7 public int Add(int a, int b) 8 { 9 return Subtract(a, b) + b; 10 } 11 12 } 13 }
三、承载和运行基本的WCF服务
承载及运行WCF主要有几个步骤:为服务创建宿主程序,建立主机,创建终结点,启用元数据交换,打开服务主机。承载及运行WCF有几种方式,(一)通过应用程序承载;(二)通过IIS来承载。
(一)利用应用程序作为宿主程序来承载及运行WCF服务
建立一个控制台程序,添加System.ServiceModel.dll引用,建立服务主机ServiceHost, new ServiceHost(typeof(CalculatorService), new Uri("http://localhost:8000/ServiceModelSamples/Service")),第一参数为服务类型,第二个为主机的基址;接着为主机添加一个终结点,终结点有服务协定Contract+服务绑定Binding+服务地址Address组成,即终结点EndPoint=A+B+C组成;接着打开建立元数据交换,接着打开服务主机。
namespace Microsoft.ServiceModel.Samples { using System.ServiceModel; using System.ServiceModel.Description; public class Program { public static void Main() { using(ServiceHost host = new ServiceHost(typeof(CalculatorService), new Uri("http://localhost:8000/ServiceModelSamples/Service"))) { try { host.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), "CalculatorService"); if (host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null) { ServiceMetadataBehavior bh = new ServiceMetadataBehavior(); bh.HttpGetEnabled = true; bh.HttpGetUrl = new Uri("metadata",UriKind.Relative); host.Description.Behaviors.Add(bh); } host.Opened += delegate(object sender, EventArgs e) { Console.WriteLine("CalculaorService已经启动,按任意键终止服务!"); };//new EventHandler(host_Opened); host.Open(); Console.ReadLine(); host.Close(); } catch (CommunicationException e) { Console.WriteLine(e.Message); host.Abort(); } } }
上面程序可以用配置程序简化,如下App.config:
1 <?xml version="1.0" encoding="utf-8"?> 2 <configuration> 3 <system.serviceModel> 4 <behaviors> 5 <serviceBehaviors> 6 <behavior name="CalculatorServiceBehavior"> 7 <serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:8000/ServiceModelSamples/Service/metadata" /> 8 </behavior> 9 </serviceBehaviors> 10 </behaviors> 11 <services> 12 <service behaviorConfiguration="CalculatorServiceBehavior" name="Microsoft.ServiceModel.Samples.CalculatorService"> 13 <endpoint address="CalculatorService" binding="wsHttpBinding" 14 bindingConfiguration="" contract="Microsoft.ServiceModel.Samples.ICalculator" /> 15 <host> 16 <baseAddresses> 17 <add baseAddress="http://localhost:8000/ServiceModelSamples/Service" /> 18 </baseAddresses> 19 </host> 20 </service> 21 </services> 22 </system.serviceModel> 23 </configuration>
namespace Microsoft.ServiceModel.Samples.Server1 { using System.ServiceModel; class Program { static void Main(string[] args) { using(ServiceHost host = new ServiceHost(typeof(CalculatorService))) { host.Opened += delegate { Console.WriteLine("CalculaorService已经启动,按任意键终止服务!"); }; host.Open(); Console.Read(); } } } }
上面的配置程序代码可以用WCF服务配置编辑器来完成,
(二)利用IIS来承载服务
新建一个service.svc文件,写入<%@ServiceHost Service="Microsoft.ServiceModel.Samples.CalculatorService"%>,其中创建主机,指定服务;第二步建立一个web.config文件,配置跟前面的配置文件一致,配置如下:
1 <?xml version="1.0" encoding="utf-8"?> 2 <configuration> 3 <system.serviceModel> 4 <services> 5 <!-- 注意: 服务名称必须与服务实现的配置名称相匹配。 --> 6 <service name="Microsoft.ServiceModel.Samples.CalculatorService" behaviorConfiguration="CalculatorServiceBehaviors"> 7 <!-- 添加下列终结点。 --> 8 <endpoint address="" binding="wsHttpBinding" contract="Microsoft.ServiceModel.Samples.ICalculator" name="CalculatorService" /> 9 <!-- 注意: 服务必须有一个 http 基址以便添加此终结点。 --> 10 <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" /> 11 </service> 12 </services> 13 <behaviors> 14 <serviceBehaviors> 15 <behavior name="CalculatorServiceBehaviors"> 16 <!-- 将下列元素添加到服务行为配置中。 --> 17 <serviceMetadata httpGetEnabled="true" /> 18 </behavior> 19 </serviceBehaviors> 20 </behaviors> 21 </system.serviceModel> 22 <system.webServer> 23 <directoryBrowse enabled="true" /> 24 </system.webServer> 25 </configuration>
利用IIS承载,生成元数据一个比较容易出错的地方就是,没有办系统盘下的C:\window\temp给IIS_USER用户开放权限,导致不能完成元数据交换。
四、创建服务程序
若采用应用程序承载服务,则必须运行应用程序,如上运行控制台程序,若采用IIS,则需启动IIS。建立一个客户端程序,本例建立一个控制台程序Client,有两种方法来建立调用的服务的方法:(一)利用Svcutil.exe来生产一个proxy.cs、App.config文件,(二)利用引入服务引用及对应Appconfig来实现对服务的调用。
(一)Svcutil.exe
在visual studio 命令提示中输入:Svcutil /out:proxy.cs /config:App.config http://localhost:8000/ServiceModelSamples/Service
(二)直接引用服务引用
客服端代码如下:
1 namespace Client2 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 Client.CalculatorClient cc = new Client.CalculatorClient(); 8 Console.WriteLine("10+20=" + cc.Add(10, 20).ToString()); 9 10 Console.ReadLine(); 11 12 } 13 } 14 }