• 初识WCF


    WCF是对现有分布式通信技术的整合,其中包括Com/DCom、.Net Remoting、Web服务及其WSE(web服务的升级版本)、MSMQ。
    .Net Remoting 远程调用,可以实现分布式开发,但是不能跨平台或者说是只能是在.Net和.Net之间进行调用。不能实现真正意义上的面向服务
    Web 服务 WSE 可以说是真正意义上的面向服务的设计,可以实现跨平台的调用,但是web服务只能通过http的方式传输,并且安全性、可靠性得不到有效的控制,所以不能完成企业级应用的要求。
    MSMQ 是基于Windows的消息队列,它的优点也很多,例如可以支持离线传输、断点传输等。但是只能在同一台服务器或者说是同一台电脑上传输,根本就谈不上分布式。


    WCF中的 "A","B","C" 介绍
    A(Address):英文理解为"地址",在计算机中是通过一个URI唯一地址标识,通过这个地址我们可以找到我们要调用的WCF服务。
    B(Binding):英文理解为"捆绑,绑定", Binding实现在Client和Service通信的所有底层细节。
    如:我们在客户端与服务端传输的时候采用的是什么样的编码,XML?Text?二进制?...采用哪
    种传输协议进行传输,TCP?Http?以及采用什么样的机制解决安全问题,SSL?加密?...
    C(Contract):英文理解为"合同",合同是什么?告诉我们哪些事能做,如些事不能做。
    Contract的主要的作用是暴露某个WCF Service所提供的所有有效的方法。
    Contract实际上是把每个方法的转化成为相对应的消息。

    三、Endpoint(终结点)
    WCF实现了网络系统的各个应用程序的通信。各个应用程序的通信是以“终结点(Endpoint)”的来实现的。
    我们在上面讲的实际例子中的A、B、C即是Endpoint 的组成部分,他是服务器间通信调用的入口。

    四:应用程序间通信
    当我们寄宿WCF服务的时候,我们必须定义一个或是多个终结点,然后Serivce端通过监听这些终结点来处理Client发来的请求。
    由于应用程序之间是靠Endpoint来通信,那么我们在Client端也必须定义终结点,只有当Client与Service的终结点完全匹配的时候才能进行通信。
    不论是在服务端还是在客户端,endpoint中的A、B、C都是完全一样的。也就是终结点完全匹配!

    WCF服务应用程序与WCF服务库
    WCF服务应用程序,是一个可以执行的程序,它有独立的进程,WCF服务类契约的定义,可以直接看到运行的效果。
    WCF服务库,可以认为是一个包含WCF服务以及契约定义的类库。不能直接运行,你可以在其他项目里引用,在宿
    主里启用托管这个库,有点类似于我们在Web项目中应用的类库

    WCF的宿主可以是 Windows 服务、COM+应用程序、WAS(Windows Activation Services,Windows进程激活服务)
    或IIS、Windows应用程序,或简单的控制台应用程序及任何.net程序。

    控制台应用程序宿主
      建立宿主
      (1)在解决方案下新建控制台输出项目 WCFHost_Console。
      (2)添加 System.ServiceModel.dll 的引用。
      (3)添加 WCF 服务类库(WCFLibrary)的项目引用。
      (4)创建宿主程序,代码如下:

     1 using System;
     2 using WCFLibrary;
     3 using System.ServiceModel;
     4 using System.ServiceModel.Description;
     5 namespace WCFHost_Console
     6 {
     7     class Program
     8     {
     9         static void Main(string[] args)
    10         {
    11             //创建宿主的基地址
    12             Uri baseAddress = new Uri("http://localhost:8080/User");
    13             //创建宿主
    14             using (ServiceHost host = new ServiceHost(typeof(User), baseAddress))
    15             {
    16                 //向宿主中添加终结点
    17                 host.AddServiceEndpoint(typeof(IUser), new WSHttpBinding(), "");
    18                 //将HttpGetEnabled属性设置为true
    19                 ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
    20                 smb.HttpGetEnabled = true;
    21                 //将行为添加到Behaviors中
    22                 host.Description.Behaviors.Add(smb);
    23                 //打开宿主
    24                 host.Open();
    25                 Console.WriteLine("WCF中的HTTP监听已启动....");
    26                 Console.ReadLine();
    27                 host.Close();
    28             }
    29         }
    30     }
    31 }

    Windows应用程序宿主
    建立宿主
      (1)在解决方案下新建Windows窗体应用程序项目 WCFHost_Form。
      (2)添加 System.ServiceModel.dll 的引用。
      (3)添加 WCF 服务类库(WCFLibrary)的项目引用。
      (4)添加应用程序配置文件App.config。
      (5)创建宿主程序MainForm窗体,并修改App.config,代码如下
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    <system.serviceModel>
    <services>
    <service name="WCFLibrary.User">
    <host>
    <baseAddresses>
    <add baseAddress="http://localhost:8081/User"/>
    </baseAddresses>
    </host>
    <endpoint address="" binding="wsHttpBinding" contract="WCFLibrary.IUser"></endpoint>
    </service>
    </services>
    <behaviors>
    <serviceBehaviors>
    <behavior>
    <serviceMetadata httpGetEnabled="True"/>
    <serviceDebug includeExceptionDetailInFaults="False"/>
    </behavior>
    </serviceBehaviors>
    </behaviors>
    </system.serviceModel>
    </configuration>

    using System;
    using WCFLibrary;
    using System.ServiceModel;
    using System.Windows.Forms;
    using System.Configuration;
    namespace WCFHost_Form
    {
        public partial class MainForm : Form
        {
            ServiceHost host;
    
            public MainForm()
            {
                InitializeComponent();
            }
    
            //应用程序加载
            private void MainForm_Load(object sender, EventArgs e)
            {
                host = new ServiceHost(typeof(User));
                //打开宿主
                host.Open();
                this.lblState.Text = "WCF中的HTTP监听已启动....";
            }
    
            //应用程序关闭
            private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
            {
                host.Close();
            }
        }
    }

    WAS宿主
    IIS7允许通过HTTP外的协议进行激活和网络通信。此环境适合开发可通过WCF支持的任何网络协议(包括http、net.tcp、net.pipe、net.msmq)进行通信的WCF服务。部署简单、管理方便,
    这些网络协议在部署时可像Http一样,直接丢到IIS7上即可,我们在下面的例子中以net.tcp为协议为例。IIS7以下的版本只能支持Http的通信。

    wcf 文件配置:
    <?xml version="1.0"?>
    <configuration>
    <system.serviceModel>
    <!--服务-->
    <services>
    <!--name:名称空间.类型名-->
    <!--behaviorConfiguration:behavior的名称,请看behavior配置节的名称-->
    <service name="WCFLibrary.User" behaviorConfiguration="MyBehavior">
    <host>
    <baseAddresses>
    <!-- 每种传输协议的baseAddress,用于跟使用同样传输协议Endpoint定义的相对地址组成完整的地址,
    每种传输协议只能定义一个baseAddress。HTTP的baseAddress同时是service对外发布服务说明页面的URL -->
    <add baseAddress="http://localhost:8732/Design_Time_Addresses/WCFLibrary/Service/"/>
    </baseAddresses>
    </host>
    <!-- 除非完全限定,否则地址将与上面提供的基址相关,每个服务可以有多个Endpoint -->
    <!-- Address:指定这个Endpoint对外的URI,这个URI可以是个绝对地址,也可以是个相对于baseAddress的
    相对地址。如果此属性为空,则这个Endpoint的地址就是baseAddress-->
    <!--bindingConfiguration:binding的名称,请看binding配置节的名称-->
    <endpoint address="" binding="wsHttpBinding" contract="WCFLibrary.IUser" bindingConfiguration="myHttpBinding">
    <identity>
    <dns value="localhost"/>
    </identity>
    </endpoint>
    <!-- 此终结点不使用安全绑定,应在部署前确保其安全或将其删除-->
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
    </service>
    </services>
    <!--绑定-->
    <bindings>
    <wsHttpBinding>
    <binding name="myHttpBinding">
    <security mode="None">
    <message clientCredentialType="Windows" />
    </security>
    </binding>
    </wsHttpBinding>
    </bindings>

    <!--行为-->
    <behaviors>
    <serviceBehaviors>
    <behavior name="MyBehavior">
    <!-- httpGetEnabled - bool类型的值,表示是否允许通过HTTP的get方法获取sevice的WSDL元数据 -->
    <serviceMetadata httpGetEnabled="True"/>
    </behavior>
    </serviceBehaviors>
    </behaviors>
    </system.serviceModel>
    </configuration>

    WCF在通信过程中有三种模式:请求与答复、单向、双工通信。以下我们一一介绍。
    请求与答复模式:客户端发送请求,然后一直等待服务端的响应(异步调用除外),期间处于假死状态,直到服务端有了答复后才能继续执行其他程序,
    请求与答复模式为WCF的默认模式
    单向模式:
    客户端向服务端发送求,但是不管服务端是否执行完成就接着执行下面的程序。[OperationContract(IsOneWay = true)]

    双工模式:
    双工模式建立在上面两种模式的基础之上,实现客户端与服务端相互的调用。相互调用
    支持回调的绑定有4种:WSDualHttpBinding、NetTcpBinding、NetNamedPipeBinding、NetPeerTcpBinding

      

      

  • 相关阅读:
    被.net郁闷的一天
    使用批处理出现奇怪的现象
    我们应该更相信ghost
    asp.net设置默认按钮的一种方法(041217更新)
    asp中access到sql server导入升级后要做的工作。
    一种简单方便的权限控制方案
    为何我的本本不能打开休眠功能?
    祝贺自己的blog开张
    sql server中分页获取数据的存储过程
    httpcompress实际效果能有多少?
  • 原文地址:https://www.cnblogs.com/hbsfgl/p/3853728.html
Copyright © 2020-2023  润新知