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

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>

运行结果:






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值