У меня есть проект, который использует веб-сервис XML SOAP. Ниже приведен фрагмент файла WSDL службы (обратите внимание на символ новой строки в значении soapAction):
<!-- omitted for brevity -->
<wsdl:operation name="List">
<soap11:operation soapAction=
"http://busdox.org/serviceMetadata/ManageBusinessIdentifierService/1.0/
:listIn"
style="document" />
<wsdl:input>
<soap11:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap11:body use="literal" />
</wsdl:output>
<wsdl:fault name="NotFoundFault">
<soap:fault name="NotFoundFault" use="literal"/>
</wsdl:fault>
<wsdl:fault name="UnauthorizedFault">
<soap:fault name="UnauthorizedFault" use="literal"/>
</wsdl:fault>
<wsdl:fault name="InternalErrorFault">
<soap:fault name="InternalErrorFault" use="literal"/>
</wsdl:fault>
<wsdl:fault name="BadRequestFault">
<soap:fault name="BadRequestFault" use="literal"/>
</wsdl:fault>
</wsdl:operation>
<!-- omitted for brevity -->
После успешного использования службы с использованием сгенерированного клиента, который наследуется от SoapHttpClientProtocol
, я хотел, чтобы яобновить библиотеку до netstandard
. Итак, я недавно переключился на клиента WCF (через связанные службы в Visual Studio), который наследуется от System.ServiceModel.ClientBase<>
. Теперь вызовы вышеуказанного метода SOAP не совпадают со следующим сообщением об исключении:
The given SOAPAction http://busdox.org/serviceMetadata/ManageBusinessIdentifierService/1.0/%20%20%20%20%20%20%20%20%20:listIn does not match an operation.
С предыдущим клиентом они работали просто отлично. Может кто-нибудь помочь с объяснением?
Вот обе версии сгенерированной заглушки C # в клиенте службы:
/// Using SoapHttpClientProtocol
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://busdox.org/serviceMetadata/ManageBusinessIdentifierService/1.0/ :l" +
"istIn", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Bare)]
[return: System.Xml.Serialization.XmlElementAttribute("ParticipantIdentifierPage", Namespace="http://busdox.org/serviceMetadata/locator/1.0/")]
public ParticipantIdentifierPageType List([System.Xml.Serialization.XmlElementAttribute(Namespace="http://busdox.org/serviceMetadata/locator/1.0/")] PageRequestType PageRequest) {
object[] results = this.Invoke("List", new object[] {PageRequest});
return ((ParticipantIdentifierPageType)(results[0]));
}
и
/// Using the WCF client
// CODEGEN: Generating message contract since the operation List is neither RPC nor document wrapped.
[System.ServiceModel.OperationContractAttribute(Action="http://busdox.org/serviceMetadata/ManageBusinessIdentifierService/1.0/ :l" +
"istIn", ReplyAction="*")]
[System.ServiceModel.FaultContractAttribute(typeof(FaultType), Action="http://busdox.org/serviceMetadata/ManageBusinessIdentifierService/1.0/ :l" +
"istIn", Name="NotFoundFault", Namespace="http://busdox.org/serviceMetadata/locator/1.0/")]
[System.ServiceModel.FaultContractAttribute(typeof(FaultType), Action="http://busdox.org/serviceMetadata/ManageBusinessIdentifierService/1.0/ :l" +
"istIn", Name="UnauthorizedFault", Namespace="http://busdox.org/serviceMetadata/locator/1.0/")]
[System.ServiceModel.FaultContractAttribute(typeof(FaultType), Action="http://busdox.org/serviceMetadata/ManageBusinessIdentifierService/1.0/ :l" +
"istIn", Name="InternalErrorFault", Namespace="http://busdox.org/serviceMetadata/locator/1.0/")]
[System.ServiceModel.FaultContractAttribute(typeof(FaultType), Action="http://busdox.org/serviceMetadata/ManageBusinessIdentifierService/1.0/ :l" +
"istIn", Name="BadRequestFault", Namespace="http://busdox.org/serviceMetadata/locator/1.0/")]
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
ListResponse List(ListRequest request);
Только заглушки, адресованные soapActionс пробелами терпят неудачу. Другие soapActions из того же WSDL, без новых строк, поэтому без пробелов в сгенерированных заглушках работают нормально.
Я подозреваю, что пробелы в soapAction вызывают проблему.