WCF的通信过程
上一篇笔记了解了WCF的基础知识,知道了终结点的概念,作用,要素,存在于。与服务之间的关系。
关于WCF应用的通信过程以一个情景案例来看:
1.WCF中的A,B,C:
A:Address 地址,理解为服务的Url,计算机通过Url地址找到我们需要调用的服务。
B:Binding 绑定,Binding实现客户端和服务端通信的底层细节。
C:contract 契约,Contract的主要的作用是暴露某个WCF Service所提供的所有有效的方法。Contract实际上是把每个方法的转化成为相对应的消息。
2.WCF中的终结点(Endpoint):
WCF实现网络系统中各个应用程序之间的通信,应用程序之间的通信是依靠终结点(Endpoint)来实现,A,B,C是终结点的三个要素。它是服务之间通信调用的入口。
3.情景案例:
员工A手里有一张便签,标记着:地址、绑定、合同.....而合作方手里也有一张便签,标记着同样的内容,并且一直得在等待员工A的出现。只有当便签上的内容一样时,合作方A才会签署合同回执。
4.应用程序之间的通信:
当我们寄宿WCF服务的时候,我们必须定义一个或是多个终结点,然后Serivce端通过监听这些终结点来处理Client发来的请求。由于应用程序之间是靠Endpoint来通信,那么我们在Client端也必须定义终结点,只有当Client与Service的终结点完全匹配的时候才能进行通信。
只有终结点中的A,B,C完全匹配的时候才能通信。
编写一个简单的案例:
1.先创建WCF应用程序:
2.在项目中引入:System.ServieModel;
3.添加自定义的WCF【服务文件】User.svc,此时vs2010会自动生成WCF接口文件IUser.cs,我们在IUser中定义WCF方法ShowName,在User.svc.cs对该接口的方法进行实现。
代码:
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; namespace FirstWCFService { //在WCF中的接口与普通接口的区别只在于两个上下文,其他的和我们正常学习的接口一样。定义这个上下文要添加System.ServiceModel的引用。 //[ServiceContract],来说明接口是一个WCF的接口,如果不加的话,将不能被外部调用。 //[OperationContract],来说明该方法是一个WCF接口的方法,不加的话同上。 [ServiceContract] public interface IUsers { [OperationContract] string ShowUserInfo(string name,string id); } }
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; namespace FirstWCFService { public class Users : IUsers { public string ShowUserInfo(string name, string id) { string WcfString = string.Format("WCF服务显示:用户姓名:{0},用户账号:{1}",name,id); return WcfString; } } }
配置:
<?xml version="1.0" encoding="utf-8"?> <configuration> <appSettings> <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> </appSettings> <system.web> <compilation debug="true" targetFramework="4.5" /> <httpRuntime targetFramework="4.5"/> </system.web> <!--basicHttpBinding的地址和配置--> <!--具体模式:http://[Hostname]:[Port]/[ServiceAddress] https://[Hostname]:[Port]/[ServiceAddress]--> <!--http://[Hostname]:[Port]/[ServiceAddress]--> <system.serviceModel> <services> <service name="FirstWCFService.Users"> <endpoint address="http://localhost/WCF/Users.svc" binding="basicHttpBinding" bindingConfiguration="MyBinding" contract="FirstWCFService.IUsers"> <!--三要素:address(服务地址),binding(绑定,确定通信协议),contract(契约)--> <!--bindingConfiguration(可选,绑定设置名)--> </endpoint> </service> </services> <bindings> <!--basicHttpBinding绑定的属性设置--> <basicHttpBinding> <binding name="MyBinding" hostNameComparisonMode="StrongWildcard" receiveTimeout="00:10:00" sendTimeout="00:10:00" openTimeout="00:10:00" closeTimeout="00:10:00" maxBufferSize="65536" maxBufferPoolSize="524288" transferMode="Buffered" messageEncoding="Text" textEncoding="utf-8" bypassProxyOnLocal="false" useDefaultWebProxy="True"> <security mode="None"></security> </binding> </basicHttpBinding> </bindings> </system.serviceModel> </configuration>
4.将WCF程序寄宿在B服务器的IIS之上
首先我们将WCF应用程序发布一下,然后部署在B服务器的IIS之上,如下图所示:
5.测试,在客户端进行调用:
1.创建一个空的ASP.Net项目,然后将服务添加引用进来,然后添加一个Asp页面:
代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WCFTest.aspx.cs" Inherits="WCFCilent.WCFTest" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> </head> <body> <form id="form1" runat="server"> <asp:TextBox ID="txtName" runat="server"></asp:TextBox><br /> <asp:TextBox ID="txtName1" runat="server"></asp:TextBox><br /> <asp:Button ID="btnSubmit" runat="server" Text="测试WCF服务" OnClick="btnClick" /> </form> </body> </html> using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using WCFCilent.WCFService; namespace WCFCilent { public partial class WCFTest : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void btnClick(object sender, EventArgs e) { UsersClient user = new UsersClient(); string result = user.ShowUserInfo(this.txtName.Text,this.txtName1.Text); Response.Write(result); } } }
配置:
<?xml version="1.0" encoding="utf-8"?> <!-- 有关如何配置 ASP.NET 应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkId=169433 --> <configuration> <system.web> <compilation debug="true" targetFramework="4.5" /> <httpRuntime targetFramework="4.5" /> </system.web> <!--测试WCF通信过程配置--> <!--<system.serviceModel> <client> <endpoint address="http://localhost/WCF/Users.svc" binding="basicHttpBinding" contract="WCFService.IUsers" /> </client> </system.serviceModel>--> <!--basicHttpBinding的地址和配置--> <!--具体模式:http://[Hostname]:[Port]/[ServiceAddress] https://[Hostname]:[Port]/[ServiceAddress]--> <!--http://[Hostname]:[Port]/[ServiceAddress]--> <!--客户端配置--> <system.serviceModel> <client> <endpoint address="http://localhost/WCF/Users.svc" binding="basicHttpBinding" bindingConfiguration="MyBinding" contract="WCFService.IUsers"></endpoint> </client> <bindings> <basicHttpBinding> <binding name="MyBinding" hostNameComparisonMode="StrongWildcard" receiveTimeout="00:10:00" sendTimeout="00:10:00" openTimeout="00:10:00" closeTimeout="00:10:00" maxBufferSize="65536" maxBufferPoolSize="524288" transferMode="Buffered" messageEncoding="Text" textEncoding="utf-8" bypassProxyOnLocal="false" useDefaultWebProxy="True"> <security mode="None"></security> </binding> </basicHttpBinding> </bindings> </system.serviceModel> </configuration> 运行结果: