【问题标题】:Relationship between WCF Operation Name and ActionWCF 操作名称和操作之间的关系
【发布时间】: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 来识别单个服务方法?一个就够了。

【问题讨论】:

    标签: wcf soap


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢。但我仍然不明白为什么我们仍然需要 OperationName?如果 Action 可以识别服务操作,为什么不直接使用 Action 值作为 SOAP 包装元素名称?
    • 例如,因为这种方式你可以使用相同的包装元素进行多个操作,但更重要的原因是互操作性。 WCF 可用于向其他平台公开服务,也可以使用来自其他平台的服务,您需要分离操作和包装元素名称的方法。 Wrapper 元素只是消息序列化的一部分。
    猜你喜欢
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 2016-06-25
    • 1970-01-01
    • 2019-01-19
    • 2018-10-26
    相关资源
    最近更新 更多