Пробелы в soapAction получают кодировку HTML и нарушают работу клиента службы WCF - PullRequest
0 голосов
/ 13 октября 2019

У меня есть проект, который использует веб-сервис 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 вызывают проблему.

...