WCF技术内幕 第4章 (1)

第4章 WCF 101

4.1 WCF快速启动

定义服务契约

契约表示消息应用系统外形的主要方式。外形,是指服务展示的操作,操作生成、使用的消息Schema和每个操作实现的消息交换模式。

using System.ServiceModel;

namespace WCFServices
{
    [ServiceContract]
    public interface IHelloWCFContract
    {
        [OperationContract]
        void Say(string value);
    }
}

定义地址和绑定

局部变量address使用的是HTTP格式的统一资源标识符(URI)。选择这个地址强制要求我们使用HTTP传输。绑定是指定传输,消息编排和消息编码的主要方式。

            Uri address = new Uri("http://www.andersoft.com/IHelloWCFContract");

            BasicHttpBinding binding = new BasicHttpBinding();

创建一个终结点并启动侦听

使用地址,绑定,契约来构建一个终结点(endpoint),并在此终结点上侦听发送来的消息。

System.ServiceModel.ServiceHost类型构建和托管终结点,并管理接收应用底层结构的其他部分,如线程和对象的生命周期。

AddServiceEndpoint方法没有开始循环侦听,它只是简单地改变了ServiceHost对象的状态。

Open方法会验证ServiceHost对象的状态,从它的状态里构建终结点,并且开始侦听。

            ServiceHost svc = new ServiceHost(typeof(HelloWCFService));
            svc.AddServiceEndpoint(typeof(IHelloWCFContract), binding, address);

            svc.Open();

            Console.WriteLine("The HelloWCF receiving application is ready");
            Console.ReadKey();

            svc.Close();

编译运行和检验接收者

 

 

可用netstat.exe检查应用是否确实在侦听。

netstat -a -b

  TCP    [::]:6543              Anders-MSFT:0          LISTENING
 Can not obtain ownership information

C:\Users\v-xufeif>netstat -a -b -> 1.txt

向接收者发送消息

发送消息的基础结构也需要依靠地址,绑定和契约,这与接收消息的基础结构类似。

绝大多数接收者使用Service.ServiceModel.EndpointAddress类型表示消息发送的目标。

using System;
using System.ServiceModel;

using WCFServices;

namespace ClientApp
{
    class Program
    {
        static void Main(string[] args)
        {
            BasicHttpBinding binding = new BasicHttpBinding();

            Uri address = new Uri("http://localhost:6543/IHelloWCFContract");

            EndpointAddress endpoint=new EndpointAddress(address);

            IHelloWCFContract channel = ChannelFactory<IHelloWCFContract>.CreateChannel(binding, endpoint);

            channel.Say("WCF, hello!!!");

            Console.ReadKey();
        }
    }
}

看消息

using System;
using System.ServiceModel;

namespace WCFServices
{
    public class HelloWCFService : IHelloWCFContract
    {
        public void Say(string value)
        {
            Console.WriteLine("Accepted a string:{0}", value);
            Console.WriteLine(OperationContext.Current.RequestContext.RequestMessage.ToString());
        }
    }
}

Host 端输出:

The HelloWCF receiving application is ready
Accepted a string:WCF, hello!!!
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <To s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://localhost:6543/IHelloWCFContract</To>
    <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://tempuri.org/IHelloWCFContract/Say</Action>
  </s:Header>
  <s:Body>
    <Say xmlns="http://tempuri.org/">
      <value>WCF, hello!!!</value>
    </Say>
  </s:Body>
</s:Envelope>


小变化,大影响

修改绑定为:

            WSHttpBinding binding = new WSHttpBinding();

Host端输出修改为:

The HelloWCF receiving application is ready
Accepted a string:WCF, hello!!!
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
  <s:Header>
    <a:Action s:mustUnderstand="1" u:Id="_2">http://tempuri.org/IHelloWCFContract/Say</a:Action>
    <a:MessageID u:Id="_3">urn:uuid:c43dbb5d-8c9e-44c8-bc74-601ad3fa8a4e</a:MessageID>
    <a:ReplyTo u:Id="_4">
      <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
    </a:ReplyTo>
    <a:To s:mustUnderstand="1" u:Id="_5">http://localhost:6543/IHelloWCFContract</a:To>
    <o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
      <u:Timestamp u:Id="uuid-10e26df0-5e09-4b55-b45b-e0c53c0311ca-11">
        <u:Created>2013-01-16T06:40:53.143Z</u:Created>
        <u:Expires>2013-01-16T06:45:53.143Z</u:Expires>
      </u:Timestamp>
      <c:SecurityContextToken u:Id="uuid-a6f31f28-3003-49ed-91b9-a6e15dba7438-4" xmlns:c="http://schemas.xmlsoap.org/ws/2005/02/sc">
        <c:Identifier>urn:uuid:980895a5-1812-4bb3-9d27-323f67aa71cd</c:Identifier>
      </c:SecurityContextToken>
      <c:DerivedKeyToken u:Id="uuid-10e26df0-5e09-4b55-b45b-e0c53c0311ca-9" xmlns:c="http://schemas.xmlsoap.org/ws/2005/02/sc">
        <o:SecurityTokenReference>
          <o:Reference ValueType="http://schemas.xmlsoap.org/ws/2005/02/sc/sct" URI="#uuid-a6f31f28-3003-49ed-91b9-a6e15dba7438-4" />
        </o:SecurityTokenReference>
        <c:Offset>0</c:Offset>
        <c:Length>24</c:Length>
        <c:Nonce>cx3rAX93hdA9S1wXO25upw==</c:Nonce>
      </c:DerivedKeyToken>
      <c:DerivedKeyToken u:Id="uuid-10e26df0-5e09-4b55-b45b-e0c53c0311ca-10" xmlns:c="http://schemas.xmlsoap.org/ws/2005/02/sc">
        <o:SecurityTokenReference>
          <o:Reference ValueType="http://schemas.xmlsoap.org/ws/2005/02/sc/sct" URI="#uuid-a6f31f28-3003-49ed-91b9-a6e15dba7438-4" />
        </o:SecurityTokenReference>
        <c:Nonce>xkIj5JKn/oZaYc9LPgvLvg==</c:Nonce>
      </c:DerivedKeyToken>
      <e:ReferenceList xmlns:e="http://www.w3.org/2001/04/xmlenc#">
        <e:DataReference URI="#_1" />
        <e:DataReference URI="#_6" />
      </e:ReferenceList>
      <e:EncryptedData Id="_6" Type="http://www.w3.org/2001/04/xmlenc#Element" xmlns:e="http://www.w3.org/2001/04/xmlenc#">
        <e:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc" />
        <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
          <o:SecurityTokenReference>
            <o:Reference ValueType="http://schemas.xmlsoap.org/ws/2005/02/sc/dk" URI="#uuid-10e26df0-5e09-4b55-b45b-e0c53c0311ca-10" />
          </o:SecurityTokenReference>
        </KeyInfo>
        <e:CipherData>
          <e:CipherValue>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</e:CipherValue>
        </e:CipherData>
      </e:EncryptedData>
    </o:Security>
  </s:Header>
  <s:Body u:Id="_0">
    <Say xmlns="http://tempuri.org/">
      <value>WCF, hello!!!</value>
    </Say>
  </s:Body>
</s:Envelope>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值