• 了解WCF的前世今生之实现服务端(一)


    http://www.cnblogs.com/jiagoushi/archive/2013/03/15/2962351.html

    1.WCF是对现有的分布式通信技术的一个整合,其中包括Com/DCom、.Net Remoting、Web服务及其WSE(web服务的升级版本)、MSMQ,是微软大一统的技术。

    2..Net Remoting 是用于远程调用,但是不支持跨平台,也就是说通信的双方都要支持.net,其实没有实现真正意义上的面向服务。

    3.web service 和WSE可以说是真正的面向服务的设计,也实现了跨平台,但是它只能基于HTTP的方式传输,而且安全性、可靠性的得不到保障,所以也达不到企业级开发的要求。

    4.MSMQ 是基于Windows的消息队列,它的优点也很多,例如可以支持离线传输、断点传输等。但是只能在同一台服务器或者说是同一台电脑上传输,根本就谈不上分布式

    总结:WCF是所有这些通信技术的大一统,结合了他们所有的优点,能够实现高效率、可靠性、安全性、跨平台、跨语言调用。

    msdn上关于WCF说明:http://msdn.microsoft.com/zh-cn/library/vstudio/ms735119(v=vs.90).aspx

    第一节 入门教程

    一.学习完本章你能有什么收获?

       你可以大概知道创建wcf服务和客户端应用程序所需的步骤。

    二.wcf服务是什么?

        服务它是一种构造,它公开一个或者多个终结点,每个终结点提供一种或多种操作。每个终结点提供下列信息:服务在哪里;一个绑定,其中包含客户端必须与服务通信的信息;一个协定,用于定义服务向客户端提供的功能。

    三.接下来学习的内容:定义服务、实现服务、如何在代码中配置服务、承载服务、运行服务。

     1.WCF 提供了一个 ServiceModel Metadata Utility Tool (Svcutil.exe) 来自动完成以下过程:访问发布的这些元数据,然后使用这些元数据来构造和配置服务的客户端应用程序。(有空研究下这个工具)

      3.1 如何:定义 Windows Communication Foundation 服务协定

          创建基本 WCF 服务时,第一项任务是定义协定。协定指定服务支持的操作。可以将操作视为一个 Web 服务方法。通过定义 C++、C# 或 VB 接口可创建协定。接口中的每个方法都对应于特定的服务操作。每个接口都必须将 ServiceContractAttribute 应用于自身,而每个操作都必须将OperationContractAttribute 应用于自身。如果接口中的一个方法具有 ServiceContractAttribute 而没有 OperationContractAttribute,则不公开该方法。

              

    1. 通过在“开始”菜单中右击“Visual Studio 2008”并选择“以管理员身份运行”,以管理员身份打开该程序。

    2. 创建新的控制台应用程序项目。在“新建项目”对话框中,选中“Visual Basic”“Visual C#”,并选择“控制台应用程序”模板,并命名为Service。使用默认的位置。

    3. 将默认的 Service 命名空间更改为 Microsoft.ServiceModel.Samples

    4. 将对 System.ServiceModel.dll 的引用添加到项目。

      1. “解决方案资源管理器”中,右击项目文件夹下的“引用”文件夹,然后选择“添加引用”
      2. 单击“添加引用”对话框中的“浏览”选项卡,导航到“c:WindowsMicrosoft.NetFrameworkv3.0Windows Communication Foundation”,选择“System.ServiceModel.dll”,然后单击“确定”
      注意:
      在使用命令行编译器(例如 Csc.exe 或 Vbc.exe)时,还必须提供程序集的路径。例如,在运行 Windows Vista 的计算机上,默认情况下的路径为:WindowsMicrosoft.NETFrameworkv3.0Windows Communication Foundation。
    5. 为 System.ServiceModel 命名空间添加一个 using 语句(在 Visual Basic 中为 Imports)。

    6. 定义一个名为 ICalculator 的新接口,并向该接口应用 Namespace 值为“http://Microsoft.ServiceModel.Samples”的ServiceContractAttribute 属性。显式指定命名空间是一种最佳做法,因为这样可防止将默认命名空间值添加到协定名称。

      注意:
      使用属性来批注接口或类时,可以从属性名称中去掉“Attribute”部分。因此 ServiceContractAttribute 将变成 [ServiceContract]
    7. 在接口中为 ICalculator 协定公开的每个操作(加、减、乘和除)声明一个方法,并对希望作为公共 WCF 协定的一部分公开的每个方法应用 OperationContractAttribute 属性

          总结:定义服务其实就是将ServiceContract 和 OperationContract 分别应用于接口和方法(不应用则不公开方法)的动作。

         3.2 如何:实现 服务协定 

    1. 在定义了 ICalculator 接口的同一文件中创建一个名为 CalculatorService 的新类。CalculatorService 实现 ICalculator 接口。

    2. 在 CalculatorService 类中实现在 ICalculator 接口中定义的每个方法。

          总结:实现的话就是声明一个类,继承接口然后实现接口里面的方法

       服务协定代码如下:

     1 class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             //创建一个ServiceHost
     6             using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService)))
     7             {
     8                 // Open the ServiceHost to create listeners
     9                 serviceHost.Open();
    10                 Console.WriteLine("服务已经开启!");
    11                 Console.WriteLine("按回车键结束服务!");
    12                 Console.WriteLine();
    13                 Console.ReadLine();
    14             }
    15         }       
    16 
    17     }
    18     [ServiceContract(Namespace = "http;//Microsoft.ServiceModel.Samples")]//定义服务协定完成
    19     public interface ICalculator
    20     {
    21         [OperationContract]
    22         double Add(double n1, double n2);
    23         [OperationContract]
    24         double Subtract(double n1, double n2);
    25         [OperationContract]
    26         double Multiply(double n1, double n2);
    27         [OperationContract]
    28         double Divide(double n1, double n2);
    29     }
    30 
    31     public class CalculatorService : ICalculator
    32     {
    33         public double Add(double n1, double n2)
    34         {
    35             return n1 + n2;
    36         }
    37 
    38         public double Subtract(double n1, double n2)
    39         {
    40             return n1 - n2;
    41         }
    42 
    43         public double Multiply(double n1, double n2)
    44         {
    45             return n1 * n2;
    46         }
    47 
    48         public double Divide(double n1, double n2)
    49         {
    50             return n1 / n2;
    51         }
    52     }

      服务端配置如下:

      

     1  <!--name =命名空间的加上服务的名称--> 
     2   <system.serviceModel>
     3     <!--services >
     4       <service name="Microsoft.ServiceModel.Samples.CalculatorService">
     5         <host>
     6           <baseAddresses>
     7             <add baseAddress="http://localhost:8084/ServiceModelSamples/service"/>
     8           </baseAddresses>
     9         </host>
    10       </service>
    11     </services>-->
    12     <services>
    13       <service name="Microsoft.ServiceModel.Samples.CalculatorService" behaviorConfiguration="customServiceBehavior">
    14         <host>
    15           <baseAddresses>
    16             <!--<add baseAddress="http://localhost:8705/Hantele.Habis.Server/ResourceService" />-->
    17             <add baseAddress="net.tcp://localhost:8084/ServiceModelSamples/service" />
    18           </baseAddresses>
    19         </host>
    20         <endpoint address="" binding="netTcpBinding" bindingConfiguration="netTcpBindingConfiguration" contract="Microsoft.ServiceModel.Samples.ICalculator" />       
    21       </service>
    22     </services>
    23     <behaviors>
    24       <serviceBehaviors>
    25         <behavior name="customServiceBehavior">
    26           <serviceMetadata httpGetEnabled="false" />
    27           <serviceDebug includeExceptionDetailInFaults="true" />
    28           <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
    29         </behavior>
    30       </serviceBehaviors>
    31     </behaviors>
    32     <bindings>
    33       <netTcpBinding>
    34         <binding name="netTcpBindingConfiguration" sendTimeout="00:10:00" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" portSharingEnabled="true">
    35           <readerQuotas
    36             maxArrayLength="2147483647"
    37             maxBytesPerRead="2147483647"
    38             maxDepth="2147483647"
    39             maxNameTableCharCount="2147483647"
    40             maxStringContentLength="2147483647" />
    41           <security mode="None" />
    42         </binding>
    43       </netTcpBinding>
    44     </bindings>
    45   </system.serviceModel>
  • 相关阅读:
    【转】Linux逻辑卷管理
    oracle range分区表已经有了MAXVALUE 分区,如何添加分区?要不能删除MAXVALUE分区里的数据,不影响在线应用。
    切换用户后whoami打印用户的问题
    tomcat版本号修改已dwr配置错误安全漏洞整改
    [LeetCode]: 64: Minimum Path Sum
    [LeetCode]: 292: Nim Game
    [LeetCode]: 22 : Generate Parentheses
    [LeetCode]: 121: Best Time to Buy and Sell Stock
    [LeetCode]: 62: Unique Paths
    [LeetCode]: 145: Binary Tree Postorder Traversal
  • 原文地址:https://www.cnblogs.com/lihongchen/p/3595827.html
Copyright © 2020-2023  润新知