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>
运行结果: