WCF

一、一个完整的WCF解决方案包括如下四个部分:

  1. 契约(Contracts):    主要定义了实现那些服务,如何访问服务

  2. 服务(Services):        实现契约定义的方法

  3. 宿主程序(Hosting):    提供底层传输功能的支持

  4. 客户端(Client):        根据契约访问服务

二、WCF 实现双工通信

    核心就是CallbackContract

2.1 定义Contract

2.1.1 ServiceContract

    Name定义暴露在客户端面前的服务契约,CallbackContract 定义 服务端调用客户端,即服务端主动和客户端通信。

OperationConatract 暴露在外的用于被调用的方法

[ServiceContract(Name = "SampleDuplexHello", CallbackContract = typeof(IHelloCallbackContract), SessionMode = SessionMode.Required)]
    public interface IDuplexHello
    {
        [OperationContract(IsOneWay = true)]
        void Hello(string greeting);
    }

    public interface IHelloCallbackContract
    {
        [OperationContract(IsOneWay = true)]
        void Reply(string responseToGreeting);
    }

2.2 Service实现Contract 定义的逻辑

   public class DuplexHelloService : IDuplexHello
    {
        public DuplexHelloService()
        {
            Console.WriteLine("Service object created: " + this.GetHashCode().ToString());
        }

        public void Hello(string greeting)
        {
            Console.WriteLine("Caller sent: " + greeting);
            Console.WriteLine("Session ID: " + OperationContext.Current.SessionId);
            Console.WriteLine("Waiting two seconds before returning call.");
            Thread.Sleep(2000);
            IHelloCallbackContract callerProxy = OperationContext.Current.GetCallbackChannel<IHelloCallbackContract>();
            string response = "Service object " + this.GetHashCode().ToString() + " received." + greeting;
            Console.WriteLine("Sending back: " + response);
            callerProxy.Reply(response);
        }
    }

2.3 Host 承载


            using (ServiceHost host = new ServiceHost(typeof(DuplexHelloService)))
            {
                ServiceMetadataBehavior smb = host.Description.Behaviors.Find<ServiceMetadataBehavior>();
                if (smb == null)
                {
                    host.Description.Behaviors.Add(new ServiceMetadataBehavior());
                }
                //暴露MetaData,以便能够让SvcUtil.exe工具生成客户端代理类和配置文件
                host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding(), "mex");
                host.Open();
                Console.WriteLine("service listen on endpoint ...");
                Console.WriteLine("Press ENTER to stop ...");
                Console.ReadLine();
                host.Abort();
                host.Close();
            }

 

配置接口

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    </startup>

  <runtime>
    <legacyUnhandledExceptionPolicy enabled="true"/>
  </runtime>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="NoneSecurity" closeTimeout="00:01:00" openTimeout="00:01:00"
        receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false"
        bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
        maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
        transferMode="Streamed"
        useDefaultWebProxy="true">
          <readerQuotas maxDepth="64" maxStringContentLength="2147483647"
            maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
          <security mode="None">
            <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
            <message clientCredentialType="UserName" algorithmSuite="Default" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>

    <services>
      <service name="ConsoleWCF.Services.WebControlService"  behaviorConfiguration="CalculatorServiceBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="http://127.0.0.1:8000/"/>
          </baseAddresses>
        </host>
        <!--<endpoint  binding="webHttpBinding"  behaviorConfiguration="WebBehavior" contract="ConsoleWCF.Services.IWebControlService">
        </endpoint>-->
        <endpoint  binding="basicHttpBinding" bindingConfiguration="NoneSecurity"  contract="ConsoleWCF.Services.IWebControlService">
        </endpoint>
      </service>
      <service name="ConsoleWCF.Services.DuplexHelloService">
        <endpoint address="net.tcp://127.0.0.1:50001/StudentServiceEndPoint"
            binding="netTcpBinding" bindingConfiguration="" contract="ConsoleWCF.Services.IDuplexHello" />
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://127.0.0.1:50001/StudentServiceEndPoint" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="CalculatorServiceBehavior">
          <serviceTimeouts />
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="WebBehavior">
          <webHttp />
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>

</configuration>

 

2.4 客户端根据契约访问

2.4.1 Client端契约实现

   public class SampleDuplexHelloCallbackInstance : SampleDuplexHelloCallback
    {
        public void Reply(string responseToGreeting)
        {
            Console.WriteLine("Server Reply: " + responseToGreeting);
        }
    }

 

2.4.2

         InstanceContext site = new InstanceContext(new SampleDuplexHelloCallbackInstance());
            SampleDuplexHelloClient client = new SampleDuplexHelloClient(site);
            string msg = " This is a Client Message sent to Server side...";
            client.Hello(msg);

转载于:https://my.oschina.net/u/3763295/blog/1627644

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值