Как устанавливается значение OperationContractAttribute.Action?
Я использую опцию "Add Service Reference" в Visual Studio, чтобы создать прокси-класс с использованием файла WSDL, предоставленного мне третьей стороной. Я получил 2 версии WSDL - мы будем называть их "СТАРЫЙ" и "НОВЫЙ".
Несмотря на то, что файлы WSDL предполагаются одинаковыми (новый получил обновленную версию методов), при создании прокси-классов я получаю другие значения в 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")]
Я не могу понять, откуда взято значение "Действие".
В старом WSDL значение допустимо, но в новом WSDL совершенно неверно, и я получаю исключение при попытке использовать сервис в WS
Когда я просматриваю старый файл wsdl, я вижу "soapAction" с тем же значением; похоже, откуда оно взято. Однако в НОВОМ wsdl есть значение там точно так же, как в СТАРОМ wsdl
<wsdl:operation name="Air_MultiAvailability">
<soap:operation soapAction="http://webservices.amadeus.com/SATRQT_13_2_1A" />
Кто-нибудь может направить меня в нужное место?
Обновить
Прочитав еще немного об элементе "Действие", я понял, что значение, которое я вижу в NEW wsdl, является значением DEFAULT (см. https://msdn.microsoft.com/en-us/library/system.servicemodel.operationcontractattribute.action(v=vs.110).aspx)
Теперь мне нужно понять, ПОЧЕМУ в OLD-файле wsdl мы получаем правильное значение Action (я полагаю, что мыльная операция определена в файле wsdl при правильной операции), а в NEW wsdl нет совпадения и значение по умолчанию заполнено?
1 ответ
Хорошо нашел проблему!
в файле WSDL было несколько "Операций" с одинаковыми именами
<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 после того, как я удалил \ переименовал ВСЕ дублированные операции (их было несколько), значение "Action" было взято из элемента "soapAction"
надеюсь, это поможет кому-то в будущем!