zoukankan      html  css  js  c++  java
  • C# WCF之用接口创建服务契约、部署及客户端连接

    服务契约描述了暴露给外部的类型(接口或类)、服务所支持的操作、使用的消息交换模式和消息的格式。每个WCF服务必须实现至少一个服务契约。使用服务契约必须要引用命名空间System.ServiceModel 。
     
    ServiceContractAttribute
    OperationContractAttribute
     
    1,先创建一个类库为ClassLibrary1,在创建一个接口interface1。
    2,添加引用和命名空间,System.ServiceModel
    3,在接口里代码如下:
    namespace ClassLibrary1
    {    //服务契约
        [ServiceContract]
       public interface Interface1
        { //操作契约
            [OperationContract]
            string Hello();
        }
    }
    4,创建一个窗体或控制台程序并创建一个类HelloClass.cs
    5,添加引用(项目里面)ClassLibrary1
    6,HelloClass1.cs里代码如下

    class HelloClass:ClassLibrary1.Interface1
        {

            public string Hello()
            {
              return   "Hello wcf!";  

    }
        }

    基本创建一个服务。创建之后需要部署。一般分为配置文件部署和代码部署。

    一,配置文件部署
    服务的三要素

    A:Address 意味着在哪里(也含有传输方式信息)

    B:Binding 意味着怎么做(与地址的传输方式要匹配)

    C:Contract意味着做什么(服务契约)

    <system.ServiceModel>

    <services>

    <service>

    <endpoint/>     /*服务和终结点*/

    </service>

    </services>

    <bindings>     /*绑定(可选)*/

    <binding>

    </binding>

    </bindings>

    <behaviors>    /*行为(可选) */

    <behavior>

    </behavior>

    </behaviors>

    </system.ServiceModel>

    终结点的地址由EndpointAddress 类表示,该类包含一个表示服务地址的统一资源定位符(URI),大多数传输的地址URI 包含四个部分。
    例如,

    “http://www.sina.com.cn:3200/mathservice”这个URI 具有以下四个部分:

    – 方案:http:

    – 计算机:www.sina.com.cn

    – (可选)端口:3200

    – 路径:/mathservice

    在上面例题上继续完善,打开app.config文件
    <system.serviceModel>
        <services>
          <service name="ConsoleApplication1.HelloClass" behaviorConfiguration="testBehavior"> <!--name为实现该契约的类-->
            <host>
              <baseAddresses>
                <add baseAddress="http://localhost:8002/test"></add><!--基地址-->
              </baseAddresses>
            </host>
            <endpoint address="" binding="basicHttpBinding" contract="ClassLibrary1.Interface1"></endpoint>
              <!--已有baseAddress基地址,address可为空;binding为绑定类型,对应Http协议;contract为所公开的协议,即所创建的服务契约接口-->
          </service>
        </services>
        <behaviors>
          <serviceBehaviors>
            <behavior name="testBehavior"> <!--与上面behaviorConfiguration="testBehavior"保持一致,可为空-->
              <serviceMetadata httpGetEnabled="true"/> <!--指定是否要发布元数据以HTTP/Get获取-->
            </behavior>
          </serviceBehaviors>
        </behaviors>
        </system.serviceModel> 
    之后需要启动服务
    在ConsoleApplication1的program.cs里添加应用和命名空间System.ServiceModel和以下代码

               ServiceHost host = null;

               host = new ServiceHost(typeof(ConsoleApplication1.HelloClass));
                host.Open();
                Console.WriteLine("服务已经启动!");
                Console.ReadLine();

    运行代码后,将http://localhost:8002/test在浏览器打开将会看到相关服务信息。
     
    二,代码部署
    先创建一个控制台程序 ConsoleApplication2,添加一个类HelloClass.cs和引用及命名空间,服务接口
    在program.cs 添加命名空间
                ServiceHost host = null;
                host = new ServiceHost(typeof(ConsoleApplication2.HelloClass));
                NetTcpBinding tcpBind = new NetTcpBinding();//设定绑定类型
                string address = "net.tcp://localhost:3200/hello";
                host.AddServiceEndpoint(typeof(ClassLibrary1.Interface1), tcpBind, address);//在服务终结点添加,协议,绑定类型,终结点地址
                host.Opened += delegate { Console.WriteLine("服务已启动!"); Console.ReadLine(); };
                host.Open();
    当服务部署成功后,客户端可以连接服务并调用方法,一般有两种方式
    一,如上一节讲的直接添加服务引用来实现
    二,纯代码实现
    先创建一个客户端,client控制台程序以及相关引用、命名空间、服务接口引用

               //绑定形式
                NetTcpBinding bind = new NetTcpBinding();
                //提供客服端与服务建立连接的地址
                EndpointAddress address = new EndpointAddress("net.tcp://localhost:3200/hello");
                //客户端通关通道工厂将消息发送到不同配置的服务终结点
                ChannelFactory<ClassLibrary1.Interface1> factory = new ChannelFactory<ClassLibrary1.Interface1>(bind, address);
                //通过通道工厂对象来获取指定类型
                ClassLibrary1.Interface1 myobject = factory.CreateChannel();
                string s = myobject.Hello();
                Console.WriteLine(s);
                Console.ReadLine();

    先启动服务,在运行客户端。

     
     
     
     
     
  • 相关阅读:
    如何有效地报告 Bug
    Linux开始结束ping命令
    【转】未能加载文件或程序集“XXX”或它的某一个依赖项。试图加载格式不正确的程序。
    .net session 使用误区
    [转] ADO.NET调用存储过程带输出参数或返回值
    ASP.NET Easyui datagrid增删改+sqlhelper
    C#分割字符串并统计重复出现的次数
    C# 读取TXT文本数据 添加到数据库
    记一次Spring项目打包问题排查
    Wiki系列(三):我的Wiki
  • 原文地址:https://www.cnblogs.com/anyihen/p/5557859.html
Copyright © 2011-2022 走看看