zoukankan      html  css  js  c++  java
  • WCF服务

      Windows Communication Foundation (WCF)是由微软发展的一组数据通信的应用程序开发接口,它是.NET框架的一部分,由.NET Framework 3.0开始引入,与Windows Presentation Foundation及 Windows Workflow Foundation并行为新一代Windows操作系统以及WinFX的三个重大应用程序开发类库。

      WCF由于集合了几乎由.NET Framework所提供的通信方法,因此学习曲线比较陡峭,开发人员必须要针对各个部份的内涵做深入的了解,才能够操控WCF来开发应用程序。

    • 通信双方的沟通方式,由合约来订定。
    • 通信双方所遵循的通信方法,由协定绑定来订定。
    • 通信期间的安全性,由双方约定的安全性层次来订定。

      

    合约(Contract)

    WCF的基本概念是以合约(Contract)来定义双方沟通的协定,合约必须要以接口的方式来呈现,而实际的服务代码必须要由这些合约接口派生并实现。合约分成了四种:

    1. 数据合约(Data Contract),订定双方沟通时的数据格式。
    2. 服务合约(Service Contract),订定服务的定义。
    3. 营运合约(Operation Contract),订定服务提供的方法。
    4. 信息合约(Message Contract),订定在通信期间改写信息内容的规范。

      

    协定绑定(Binding)

    由于WCF支持了HTTPTCPNamed PipeMSMQ,Peer-To-Peer TCP等协定,而HTTP又分为基本HTTP支持(BasicHttpBinding)以及WS-HTTP支持(WsHttpBinding),而TCP亦支持NetTcpBinding,NetPeerTcpBinding等通信方式,因此,双方必须要统一通信的协定,并且也要在编码以及格式上要有所一致。

    一个设置通信协定绑定的示例如下:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <system.serviceModel>
        <!-- 設定服務繫結的資訊 -->
        <services>
          <service name=" CalculatorService" >
            <endpoint address="" binding="wsHttpBinding" bindingConfiguration="Binding1"
                contract="ICalculator" />
          </service>
        </services>
        <!-- 設定通訊協定繫結的資訊 -->
        <bindings>
          <wsHttpBinding>
            <binding name="Binding1">
            </binding>
          </wsHttpBinding>
       </bindings>
      </system.serviceModel>
    </configuration>

    虽然WCF也可以使用SOAP做通信格式,但它和以往的ASP.NET XML Web Services不同,因此有部份技术文章中,会将ASP.NET的XML Web Services称为ASMX Service

    WCF的服务可以挂载于Console Application,Windows Application,IIS(ASP.NET)Application,Windows Service以及Windows Activation Services中,但大多都会挂在Windows Service。

    安全性层次

    WCF实现上已经支持了传输层次安全性(Transport-level security)以及信息层次安全性(Message-level security)两种。

    • 传输层次安全性:在数据传输时期加密,例如SSL
    • 信息层次安全性:在数据处理时就加密,例如使用数字签章散列或是使用金钥加密法等。

    --------------------------------------------------------------------------------------------------------------------------

    以上为概念介绍,下面我们自己来创建 一个简单的demo。

    首先,我们新建一个空白项目,紧接着创建一个控制台应用程序,在控制台应用程序下创建一个WCF服务命名问WCFService,如下。

      

      服务建好后,我们可以看到系统自动为我们创建了3个文件,分别为:app.config、IWCFService.cs、WCFService.cs。

      打开IWCFService,这是一个接口累,稍加修改如下:

    using System.ServiceModel;
    using System.Text;
    
    namespace Host
    {
        // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IWCFService”。
        [ServiceContract]  // 服務合約
        public interface IWCFService
        {
            [OperationContract]  //营运合约
            string DoWork(string msg);
        }

      在这里我们可以创建WCF合约。

      然后打开WCFService.cs文件,这个类乃是对接口的实现。

    using System.ServiceModel;
    using System.Text;
    
    namespace Host
    {
        // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“WCFService”。
        public class WCFService : IWCFService
        {
            public string DoWork(string msg)
            {
                return string.Format("你在{0}收到信息:{1}:",DateTime.Now.ToString(),msg);
            }
        }
    }

      最后需要在Program中调用:

    using System.ServiceModel;
    namespace Host
    {
        class Program
        {
            static void Main(string[] Args)
            {
                ServiceHost host = new ServiceHost(typeof(Host.WCFService));
                host.Open();
                Console.WriteLine("WCF服务已启动!");
                Console.ReadLine();
                host.Close();
    
            }
        }
    }

    从上面贴的代码不难看出System.ServiceModel程序集是必须的。这样一个简单的WCF服务就创建了,在客户端调用就不说了,另外我们还可以用多个程序集来创建WCF。

      在这里,我们先建两个类库(Server、Contracts),Contracts不明思议,就是合约,在这个程序集中创建各种我们想要的合约,然后在Server中继承并实现合约,这里需要在Server程序集中引用Contracts程序集。 完后继续创建一个控制台应用程序,在这里实现WCF。

      对于多个WCF服务,我们则需要配置app.config,这样才能找到服务节点,如下:

     <system.serviceModel>
            <behaviors>
                <serviceBehaviors>
                    <behavior name="">
                        <serviceMetadata httpGetEnabled="true" />
                        <serviceDebug includeExceptionDetailInFaults="false" />
                    </behavior>
                </serviceBehaviors>
            </behaviors>
            <services>
                <service name="Host.WCFService">
                    <endpoint address="" binding="wsHttpBinding" contract="Host.IWCFService">
                        <identity>
                            <dns value="localhost" />
                        </identity>
                    </endpoint>
                    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
                    <host>
                        <baseAddresses>
                            <add baseAddress="http://localhost:8732/Design_Time_Addresses/Host/WCFService/" />
                        </baseAddresses>
                    </host>
                </service>
              <service name="Host.NewServer">
                <endpoint address="" binding="wsHttpBinding" contract="Contracts.INewServer">
                  <identity>
                    <dns value="localhost" />
                  </identity>
                </endpoint>
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
                <host>
                  <baseAddresses>
                    <add baseAddress="http://localhost:8732/Design_Time_Addresses/Host/NewService/" />
                  </baseAddresses>
                </host>
              </service>
            </services>
        </system.serviceModel>

      有兴趣的话可以将Asp.net作为宿主搭建一个WCF服务。

  • 相关阅读:
    Vue学习笔记(一)
    Visual Studio Code (vscode)自定义用户代码段快速打出for循环等
    2019.5.5 JS相关
    项目搭建 相关
    2019.4.26 响应式布局
    android The content of the adapter has changed but ListView did not receive a notification 错误的解决方案
    ListView 加载数据时 触摸报错
    android 代码中使用textAppearance
    c/c++ 指针函数 和 函数指针
    c/c++ 指针数组 和 数组指针
  • 原文地址:https://www.cnblogs.com/xiangzhong/p/2955413.html
Copyright © 2011-2022 走看看