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。
但我只是想知道: 为什么我们需要 Action 和 Operation Name 来识别单个服务方法?一个就够了。
【问题讨论】:
【参考方案1】:您不需要Action
和OperationName
来识别服务操作。操作名称定义了 SOAP 消息的结构(包装元素名称),但它不用于操作标识。该动作用于操作识别。
有一些非标准的 SOAP 解析器使用操作名称(根主体元素)进行操作标识,但这些解析器不使用 SOAP 操作。
编辑:我今天和我的同事进行了讨论,看来我之前的回答不正确。 SOAP 协议中消息的真正唯一标识是 SOAP Action + Root 元素。所以在这种情况下,Action
定义了 SOAP 操作,OperationName
定义了包装元素的名称(用作根消息元素)。
【讨论】:
谢谢。但我仍然不明白为什么我们仍然需要 OperationName?如果 Action 可以识别服务操作,为什么不直接使用 Action 值作为 SOAP 包装元素名称? 例如,因为这种方式你可以使用相同的包装元素进行多个操作,但更重要的原因是互操作性。 WCF 可用于向其他平台公开服务,也可以使用来自其他平台的服务,您需要分离操作和包装元素名称的方法。 Wrapper 元素只是消息序列化的一部分。以上是关于WCF 操作名称和操作之间的关系的主要内容,如果未能解决你的问题,请参考以下文章
根据 WCF 服务中发布的 xml 内容识别操作,而不在 Url 中包含操作名称
在 Perl (SOAP Lite) 中调用 WCF 服务时的 SOAP 操作问题