WCF 学习
WCF 学习
一、初识WCF
1、概念:
- Windows Communication Foundaction(WCF):是微软面向服务(SOA)的应用程序提供的统一编程模型
- 它是一个面向接口的应用
- 基本组成(简称ABC)
- 地址Address:服务的地址
- 绑定Binding:定义服务的通讯方式(传输协议、编码方案)
- 契约Contract:定义服务的具体实现
- 终结点(Endpoint) :有地址、绑定和契约共同构成一个终结点,服务器通过终结点向客户端公开服务,客户端通过终结点调用服务。
2、创建步骤
-
创建一个空白解决方案
-
新建一个类库项目
-
新接一个接口
-
添加引用 System.ServiceModel
-
在接口和方法上分别添加两个注解ServiceContract和OperationContract
namespace WCFServer { [ServiceContract] public interface IFirstWcf { [OperationContract] int Add(int a, int b); } }
-
新建一个类,实现该接口;
namespace WCFServer { public class FirstWcfImpl : IFirstWcf { public int Add(int a, int b) { return a + b; } } }
-
已经完成了契约部分,我们需要为服务指定地址及绑定;
-
新建一个配置文件,比如App.config
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <services> <!-- 注册服务,name为带命名空间的实现类 --> <service name="WCFServer.FirstWcfImpl" behaviorConfiguration="behaviorConfiguration"> <host> <baseAddresses> <add baseAddress="http://localhost:8000/"/> </baseAddresses> </host> <!-- 注册契约 contract 为带命名空间的接口 --> <endpoint address="" binding="basicHttpBinding" contract="WCFServer.IFirstWcf"></endpoint> </service> </services> <behaviors> <serviceBehaviors> <!-- 名字和上边Service 的 behaviorConfiguration 名称一样 --> <behavior name="behaviorConfiguration"> <!-- 注册行为,允许get方式请求 --> <serviceMetadata httpGetEnabled="true"/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
-
新建一个控制台程序,编写启用代码
static void Main(string[] args) { using (ServiceHost host = new ServiceHost(typeof(WCFServer.FirstWcfImpl))) { host.Open(); Console.WriteLine("服务已启动,按任意键中止..."); Console.ReadKey(true); host.Close(); } }
-
启动程序,必须以管理员运行,才能运行成功;
-
用vs自带的测试工具进行测试。
D:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\WcfTestClient.exe
3、客户端调用例子
3.1、第一种调用方法 : svcutil
-
新建一个控制台程序
-
利用微软的svcutil工具生成FirstService服务的客户端代理类
-
启动:VS 2017的开发人员命令提示符 ,进入到程序目录,确保服务端已启动,执行命令
svcutil http://localhost:8000/?wsdl/o:FirstServiceClient.cs
,执行成功后,会生成两个文件output.config和FirstWcfImpl.cs-- 进入到新建项目的目录内 d:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise>cd E:\vs_demo\WCFDemo\ConsoleAppClient d:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise>e: -- 执行如下命令 E:\vs_demo\WCFDemo\ConsoleAppClient>svcutil http://localhost:8000/?wsdl/o:FirstServiceClient.cs Microsoft (R) Service Model Metadata Tool [Microsoft (R) Windows (R) Communication Foundation,版本 4.6.1055.0] 版权所有(C) Microsoft Corporation。保留所有权利。 正在尝试使用 WS-Metadata Exchange 或 DISCO 从“http://localhost:8000/?wsdl/o:FirstServiceClient.cs”下载元数据。 正在生成文件... E:\vs_demo\WCFDemo\ConsoleAppClient\FirstWcfImpl.cs E:\vs_demo\WCFDemo\ConsoleAppClient\output.config
-
将output.config修改为App.config
-
Client项目中添加引用,选择System.ServiceModel
-
编写调用代码
static void Main(string[] args) { String key = ""; while (String.Compare(key, "Q", true) != 0) { FirstWcfClient client = new FirstWcfClient(); Console.WriteLine(client.Add(3,5)); key = Console.ReadLine(); } }
3.2、第二种调用方法 : 服务引用
-
添加服务引用
-
创建对象,调用方法
static void Main(string[] args) { FirstWcf.FirstWcfClient wcf = new ConsoleAppClinent2.FirstWcf.FirstWcfClient(); int sum = wcf.Add(6,8); Console.WriteLine(sum); Console.ReadKey(); }
3.3、第三种调用方法 : IIS
-
inetmgr:打开iis
-
步骤
-
为WCF服务创建svc文件和IIS虚拟目录
-
每一个asp.net web服务都有一个.asmx文本文件,客户端通过访问asmx文件实现对web服务的调用。WCF服务也有一个对应的文本文件,后缀为svc,基于IIS的服务寄宿要求相应的wcf服务具有相应的svc文件。
-
部署于IIS站点中,对wcf服务调用体现在对svc文件的访问上;
-
新建一个web项目
-
新建svc文件(新建一个类,修改名字为service.svc ,主要是后缀名的修改)
<%@ ServiceHost Service="WCFServer.FirstWcfImpl" %>
-
web.config配置
<system.serviceModel> <services> <service name="WCFServer.FirstWcfImpl"> <endpoint binding="basicHttpBinding" contract="WCFServer.IFirstWcf"/> </service> </services> <behaviors> <serviceBehaviors> <behavior name=""> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> </behavior> </serviceBehaviors> </behaviors> <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> </system.serviceModel>
-