WCF简单案例和WCF应用的通信过程

    xiaoxiao2021-12-14  47

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

    转载请注明原文地址: https://ju.6miu.com/read-963778.html

    最新回复(0)