WCF(一)
概念:跟WebService一样,都是为了实现不同平台不用应用程序之间的数据通信,但是WebService有一个缺点就是Web通信好使,局域网通信不太好使,一般局域网使用.Net Remoting这样的技术,所以微软推出了WCF
一:第一个WebService
1.创建一个IBLL类库
2.类库里面创建一个IUserInfoService.cs,改成接口
3.引用System.ServiceModel
4.声明WCF特性标签
5.创建BLL类库,创建UseInfoService.cs,实现上面定义的接口
6.经过上面的步骤,服务代码已完成,接下来开始创建宿主(WCF服务必须寄宿在宿主上才能启动)
创建一个控制台Host,引用System.ServiceModel与接口IBLL,通过创建ServiceHost对象,也就是宿主,提供服务的主机来开启WCF服务
虽然报错显示是using()那里,但是实际是因为本例中BLL与IBLL分层了,不在同一命名空间下,尽管BLL引用了IBLL,但是不引入IBLL,App.config还是在终结点的contract服务契约这里报错
7.经过上面的步骤,完成了契约部分,接下来完成绑定和指定地址部分,也就是配置宿主的App.config配置文件。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <services> <service name="BLL.UserInfoService" behaviorConfiguration="behaviorConfiguration"> <host> <baseAddresses> <add baseAddress="http://localhost:8000/"/> </baseAddresses> </host> <endpoint address="" binding="basicHttpBinding" contract="IBLL.IUserInfoService"></endpoint> </service> <!--如果有多个契约,只需要在App.config配置文件中增加<service>节点--> <!--<service name="BLL.UserInfoService2" behaviorConfiguration="behaviorConfiguration"> <host> <baseAddresses> <add baseAddress="http://localhost:8000/"/> </baseAddresses> </host> <endpoint address="" binding="basicHttpBinding" contract="IBLL.IUserInfoService2"></endpoint> </service>--> </services> <behaviors> <serviceBehaviors> <behavior name="behaviorConfiguration"> <serviceMetadata httpGetEnabled="true"/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
8.测试WCF服务是否已经起来,找到Host宿主生成的exe文件,如果在VS直接启动会报错,所以要以管理员身份运行
9.确定WCF服务已经正常开启后,在浏览器输入WCF地址:http://localhost:8000/ 就可以访问到WCF服务了
10.服务端的服务已经构建好了,接下来模拟一个客户端,来访问WCF(使用微软的svcutil工具生成UserInfoService服务的客户端代理类,在WebService中,生成代理类只需要添加服务引用即可直接敲出来客户端代理类,我们也可以在WCF用WebService添加服务引用这种方式)
》1.首先创建一个控制台程序Client,找到Client的路径
》2.打开开发人员命令提示(注意:不是打开cmd)
》3.切换到Client目录下,输入命令:svcutil http://localhost:8000/?wsdl /o:UserInfoServiceClient.cs
》4.回到项目里面,引入System.ServiceModel与IBLL,修改output.config与UserInfoServiceClient.cs文件
11.这些都配置好以后,接下来找到Client.exe,以管理员身份运行(注意:这里是不用重新编译Client,直接找到Client.exe运行)
这样,利用WCF就实现两个应用程序之间的通信了
12.实际开发中,感觉用微软提供的这个:svcutil http://localhost:8000/?wsdl /o:UserInfoServiceClient.cs来生成客户端太麻烦了,经过测试完全可以用WebService添加服务引用来完成客户端代理类的生成
13.预绑定binding与baseAddress如何配置
HTTP地址
即使用HTTP协议进行传输(包括https安全传输协议)。其地址形式为
http://localhost:8000/
如果地址中为制定端口号,则默认端口为80
TCP地址
使用TCP协议进行传输,其形式为:
net.tcp://localhost:8000/
IPC地址
使用net.pipe进行传输,其形式为:
net.pipe://localhost/
MSMQ地址
使用Microsoft Message Queue机制进行传输,其形式为:
net.msmq://localhost/
对等网地址
使用net.p2p进行传输,其形式为:
net.p2p://localhost/
绑定 | 配置元素 | 说明 | 传输协议 | 编码格式 |
BasicHttpBinding | <basicHttpBinding> | 一个绑定,适用于与符合 WS-Basic Profile 的 Web 服务(例如基于 ASP.NET Web 服务 (ASMX) 的服务)进行的通信。 此绑定使用 HTTP 作为传输协议,并使用文本/XML 作为默认的消息编码。 | HTTP/HTTPS | Text,MTOM |
WSHttpBinding | <wsHttpBinding> | 一个安全且可互操作的绑定,适合于非双工服务约定。 | HTTP/HTTPS | Text,MTOM |
WS2007HttpBinding | <ws2007HttpBinding> | 一个安全且可互操作的绑定,可为 Security, ReliableSession 的正确版本和 TransactionFlow 绑定元素提供支持。 | HTTP/HTTPS | Text,MTOM |
WSDualHttpBinding | <wsDualHttpBinding> | 一个安全且可互操作的绑定,适用于双工服务协定或通过 SOAP 媒介进行的通信。 | HTTP | Text,MTOM |
WSFederationHttpBinding | <wsFederationHttpBinding> | 一个安全且可互操作的绑定,支持 WS 联合协议并使联合中的组织可以高效地对用户进行身份验证和授权。 | HTTP/HTTPS | Text,MTOM |
WS2007FederationHttpBinding | <ws2007FederationHttpBinding> | 一个安全且可互操作的绑定,它派生自 WS2007HttpBinding 并支持联合安全性。 | HTTP/HTTPS | Text,MTOM |
NetTcpBinding | <netTcpBinding> | 一个安全且经过优化的绑定,适用于 WCF 应用程序之间跨计算机的通信。 | TCP | Binary |
NetNamedPipeBinding | <netNamedPipeBinding> | 一个安全、可靠且经过优化的绑定,适用于 WCF 应用程序之间计算机上的通信。 | IPC | Binary |
NetMsmqBinding | <netMsmqBinding> | 一个排队绑定,适用于 WCF 应用程序之间跨计算机的通信。 | MSMQ | Binary |
NetPeerTcpBinding | <netPeerTcpBinding> | 一个支持多计算机安全通信的绑定。 | P2P | Binary |
MsmqIntegrationBinding | <msmqIntegrationBinding> | 一个绑定,适用于 WCF 应用程序和现有消息队列(也称为 MSMQ)应用程序之间跨计算机的通信。 | MSMQ | Binary |