SoapHttpClientProtocol получает неожиданный тип содержимого

Я создал прокси-класс C# через wsdl.exe из WSDL-URL. Я использую этот прокси-класс в контексте веб-приложения, которое я не контролирую (поэтому нет способа изменить web.conf или похожие). Я также не могу ничего изменить в веб-сервисе, с которым я разговариваю.

При звонке в веб-сервис я получаю следующее исключение:

Client found response content type of 'multipart/related; type="application/xop+xml"; 
boundary="uuid:5c314128-0dc0-4cad-9b1a-dc4a3e5917bb"; start="<root.message@cxf.apache.org>"; 
start-info="application/soap+xml"', but expected 'application/soap+xml'.

Из того, что я прочитал, это проблема с MTOM, используемым веб-сервисом. Теперь я пытаюсь убедить свой класс принять MTOM, но все, что я нашел, это конфигурация в web.conf,

Прокси-класс является производным от SoapHttpClientProtocol и выглядит так (соответствующие части):

[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]    
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Web.Services.WebServiceBindingAttribute(Name = "myrequestSoapBinding", Namespace = "http://namespace.of.company.of.webservice/")]
public class myrequest : System.Web.Services.Protocols.SoapHttpClientProtocol
{
    public myrequest(string url)
    {
        this.SoapVersion = System.Web.Services.Protocols.SoapProtocolVersion.Soap12;            
        this.Url = url;
    }

    [return: System.Xml.Serialization.XmlElementAttribute("return", Form = System.Xml.Schema.XmlSchemaForm.Unqualified, DataType = "base64Binary")]
    public byte[] getDocuments([System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified, DataType = "base64Binary")] byte[] input)
    {
        try
        {
            object[] results = this.Invoke("getDocuments", new object[] {
                input});
            return ((byte[])(results[0]));
        }
        catch (Exception ex)
        {
            var realResponse = StripResponse(ex.Message);
            return Encoding.UTF8.GetBytes(realResponse.ToString());
        }
    }
}

try ... catch в getDocuments это хакерский обходной путь, который получает "реальный" ответ сервиса за исключением Message - что на самом деле не так, как я хочу реализовать это.

Итак, мой вопрос: есть ли способ изменить привязку в прокси-классе, чтобы принять MTOM ответы?

1 ответ

Из небольшого объема исследований, которые я провел, пытаясь помочь, кажется, что если у вас был доступ к веб-конфигурации (а я знаю, что вы этого не делаете) и вы включили MTOM, то Visual Studio сгенерирует два прокси-класса:

  1. Стандартный, который является производным от SoapHttpClientProtocol, и;
  2. WSE с "Wse", добавленным к имени класса, производного от Microsoft.Web.Services3.WebServicesClientProtocol

Это реализация WebServicesClientProtocol, которая может принимать MTOM. Чтобы WSDL создал прокси-сервер, производный от WebServicesClientProtocol, следуйте примечанию в верхней части этой статьи MSDN.

Надеюсь, это решит проблему.

Другие вопросы по тегам