SOAP

SOAP 是基于 XML 的简易协议,可使应用程序在 HTTP 之上进行信息交换。

  • 为何使用

目前的应用程序通过使用远程过程调用(RPC)在诸如 DCOM 与 CORBA 等对象之间进行通信,但是 HTTP 不是为此设计的。RPC 会产生兼容性以及安全问题;防火墙和代理服务器通常会阻止此类流量。

通过 HTTP 在应用程序间通信是更好的方法,因为 HTTP 得到了所有的因特网浏览器及服务器的支持。SOAP 就是被创造出来完成这个任务的。

SOAP 提供了一种标准的方法,使得运行在不同的操作系统并使用不同的技术和编程语言的应用程序可以互相进行通信

WCF 中使用

WCF除了流模式传输数据外,剩下的基本来说就是消息模式。

我们不妨这样理解,WCF的服务器端和客户端是通过消息来交互的,就像我们之间在发短信一样,我发给你,你可以回复我,这叫双工

你心情不好的时候,可以不回我短信,这叫单工

而SOAP头可以理解为一种消息正文的附加信息。

  • 有何作用

举个例子,WCF的身份验证是不是很麻烦?还要颁发什么证书的,如果只是验证一个客户端的身份,如用户名什么的,那么,在调用服务方法时,动态加入一些消息头,到了服务器端就获取并验证消息头。这样一来,是不是也实现身份验证?

  • SOAPService.cs
[ServiceContract] 
public interface ISOAPService
{
    [OperationContract]
    void TestMethod();
}

public class SOAPService : ISOAPService 
{
    public void TestMethod()
    {
        int index = OperationContext.Current.IncomingMessageHeaders.FindHeader("header", "http://my");
        if (index != -1)
        {
            string hd = OperationContext.Current.IncomingMessageHeaders.GetHeader<string>(index);
            Console.WriteLine("收到的标头:{0}", hd);
        }  
    }
}
  • Client Main()
static void Main(string[] args)
{
    SOAPService.SOAPServiceClient client = new SOAPService.SOAPServiceClient();

    using (OperationContextScope scope = new OperationContextScope(client.InnerChannel))
    {
        MessageHeader myHeader = MessageHeader.CreateHeader(
            "header", "http://my", "你好,这是消息头。");
        OperationContext.Current.OutgoingMessageHeaders.Add(myHeader);

        // 调用方法  
        client.TestMethod();
        Console.WriteLine("服务方法已调用。");
    }

    Console.ReadKey();  
}

类似于 client 在调用 server 服务时候,顺带将 Header 信息也发送过去。

OperationContext.Current.IncomingMessageHeaders.FindHeader()方法可以用来查找消息头,

得到索引后,再通过OperationContext.Current.IncomingMessageHeaders.GetHeader<T>()返回对应消息头的值。注意,头名称和命名空间要和在客户端中插入的消息一致,不然,恭喜你找不到Header。

至于那个T嘛,好理解,你在客户端中插入消息头时,Value用了什么类型,这个T就最好对应着,你想它返回字符串,T就为string,想让它返回整型,T就为int了。