OperationContractAttribute.Action 值是如何设置的?

How is the OperationContractAttribute.Action value is set?

我正在使用 Visual Studio 中的 "Add Service Reference" 选项,以便使用第三方提供给我的 WSDL 文件创建代理 class。 我有 2 个版本的 WSDL - 我们称它们为 "OLD" 和 "NEW".

即使 WSDL 文件假设是相同的(新文件有更新的方法版本),在创建代理时 classes 我在 OperationContractAttribute.Action.

在旧的 wsdl 中它看起来像这样:

[System.ServiceModel.OperationContractAttribute(Action="http://webservices.amadeus.com/SATRQT_13_2_1A", ReplyAction="*")]

在新的 wsdl 中它看起来像这样:

[System.ServiceModel.OperationContractAttribute(Action="http://xml.amadeus.com/AmadeusWebServicesPT/Air_MultiAvailabilityRequest", ReplyAction="http://xml.amadeus.com/AmadeusWebServicesPT/Air_MultiAvailabilityResponse")]

我无法弄清楚 "Action" 值的来源。

在旧的 WSDL 中该值是有效的,但在新的 WSDL 中是完全错误的,当我尝试在 WS

中使用该服务时出现异常

当我查看旧的 wsdl 文件时,我可以看到具有相同值的 "soapAction";这似乎是它的来源。然而,在新的 wsdl 中有一个值与旧的 wsdl

完全一样
<wsdl:operation name="Air_MultiAvailability">
  <soap:operation soapAction="http://webservices.amadeus.com/SATRQT_13_2_1A" />

任何人都可以指引我到正确的地方吗?

更新

阅读更多关于 "Action" 元素的内容后,我意识到我在新 wsdl 中看到的值是默认值(参见 https://msdn.microsoft.com/en-us/library/system.servicemodel.operationcontractattribute.action(v=vs.110).aspx

现在我需要了解为什么在旧的 wsdl 文件中我们得到的 Action 值是正确的(我猜测来自 wsdl 文件中定义的 soapAction正确的操作)并且在新的 wsdl 中没有匹配项并且填充了默认值?

ok 找到问题了!

在 WSDL 文件中有多个 "Operation" 具有相同的名称

<wsdl:portType name="WebServices"> 
  <wsdl:operation name="DoSomething">
      <wsdl:input message="ns:DoSomething_1_1" />
      <wsdl:output message="ns:DoSomething_1_1" />
    </wsdl:operation>
    <wsdl:operation name="DoSomething">
      <wsdl:input message="ns:DoSomething_2_2" />
      <wsdl:output message="ns:DoSomething_2_2" />
    </wsdl:operation>
  </wsdl:portType>

<wsdl:binding type="ns:WebServices" name="WebServicesBinding">
    <wsdl:operation name="DoSomething">
      <soap:operation soapAction="http://webservices.my.com/DoSomething_1_1" />
    </wsdl:operation>
    <wsdl:operation name="DoSomething">
      <soap:operation soapAction="http://webservices.my.com/DoSomething_2_2" />
    </wsdl:operation>
</wsdl:binding>

"DoSomething" 在这个例子中得到了 2 个版本 1.1 和 2.2 一旦我 deleted\renamed 所有重复操作(我有多个),"Action" 值取自 "soapAction" 元素

希望这对以后的人有所帮助!