WCF 操作名称和操作之间的关系

Posted

技术标签:

【中文标题】WCF 操作名称和操作之间的关系【英文标题】:Relationship between WCF Operation Name and Action 【发布时间】:2012-03-17 19:07:15 【问题描述】:

我有一个这样定义的 WCF 服务:

[ServiceContract(Namespace = "http://AttributeServiceNameSpace", Name = "AttributeServiceName1")]
public interface IHelloIndigoService1

    [OperationContract(Name="AttributeOperationName11", Action = "aaa2")]
    String HelloIndigo11();


    [OperationContract(Name = "AttributeOperationName12", Action = "aaa1")]
    String HelloIndigo12();

我在服务调用期间捕获了 HTTP 消息,如下所示。

POST http://xxx/Service.svc/IHelloIndigoServiceAddress1HTTP/1.1

内容类型:文本/xml;字符集=utf-8

SOAPAction:“aaa2

主机:shao-02.fareast.corp.microsoft.com

内容长度:162

期望:100-继续

连接:保持活动状态

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Body>
     <AttributeOperationName11 xmlns="http://AttributeServiceNameSpace"/>
  </s:Body>
</s:Envelope>

所以我们可以看到调用服务的 SOAP 消息中都存在 Action 和 Operation Name。

但我只是想知道: 为什么我们需要 ActionOperation Name 来识别单个服务方法?一个就够了。

【问题讨论】:

【参考方案1】:

您不需要ActionOperationName 来识别服务操作。操作名称定义了 SOAP 消息的结构(包装元素名称),但它不用于操作标识。该动作用于操作识别。

有一些非标准的 SOAP 解析器使用操作名称(根主体元素)进行操作标识,但这些解析器不使用 SOAP 操作。

编辑:我今天和我的同事进行了讨论,看来我之前的回答不正确。 SOAP 协议中消息的真正唯一标识是 SOAP Action + Root 元素。所以在这种情况下,Action 定义了 SOAP 操作,OperationName 定义了包装元素的名称(用作根消息元素)。

【讨论】:

谢谢。但我仍然不明白为什么我们仍然需要 OperationName?如果 Action 可以识别服务操作,为什么不直接使用 Action 值作为 SOAP 包装元素名称? 例如,因为这种方式你可以使用相同的包装元素进行多个操作,但更重要的原因是互操作性。 WCF 可用于向其他平台公开服务,也可以使用来自其他平台的服务,您需要分离操作和包装元素名称的方法。 Wrapper 元素只是消息序列化的一部分。

以上是关于WCF 操作名称和操作之间的关系的主要内容,如果未能解决你的问题,请参考以下文章

在多个 WCF 服务之间共享类

根据 WCF 服务中发布的 xml 内容识别操作,而不在 Url 中包含操作名称

在 Perl (SOAP Lite) 中调用 WCF 服务时的 SOAP 操作问题

UML中类图与类图之间的关系

WCF:Svcutil 生成无效的客户端代理、Apache AXIS Web 服务、重载操作

Unix 与 Linux 之间是什么关系?