Ошибка десериализации мыльного сообщения wcf - PullRequest
1 голос
/ 07 июня 2011

Я получаю следующую ошибку, когда я звоню в сервис

Ошибка в десериализации тела сообщения запроса для операции «IbankClientOperation».OperationFormatter обнаружил недопустимое тело сообщения.Ожидается найти тип узла "Элемент" с именем "doClient_ws_IbankRequest" и пространством имен "http://www.informatica.com/wsdl/'. Найден тип узла" Элемент "с именем" строка "и пространством имен" http://schemas.microsoft.com/2003/10/Serialization/'

. Я использую следующий код для вызова службы

    Message requestMsg = Message.CreateMessage(MessageVersion.Soap11, "http://tempuri.org/IService1/IbankClientOperation", requestMessage);

    Message responseMsg = null;

    BasicHttpBinding binding = new BasicHttpBinding();
    IChannelFactory<IRequestChannel> channelFactory = binding.BuildChannelFactory<IRequestChannel>();
    channelFactory.Open();

    EndpointAddress address = new EndpointAddress(this.Url);
    IRequestChannel channel = channelFactory.CreateChannel(address);
    channel.Open();

    responseMsg = channel.Request(requestMsg);

1 Ответ

0 голосов
/ 07 июня 2011

Предполагая, что ваш requestMessage такой же, как в вашем другом сообщении (что, похоже, имеет место, поскольку в сообщении об ошибке говорится, что он получает строку), вы используете неверную перегрузку Message.CreateMessage. Тот, который вы используете, определяется как

Message.CreateMessage(MessageVersion version, string action, object body);

И «сообщение запроса», которое вы передаете ему, является целым конвертом сообщения. Этот, который вы используете, будет пытаться сериализовать тело (и, поскольку это строка, он будет сериализовать его как <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">...</string> - что в точности соответствует вашему сообщению об ошибке.

То, что вам нужно использовать, поскольку у вас уже есть конверт SOAP, это одна перегрузка, которая принимает это, например, приведенная ниже:

Message.CreateMessage(XmlReader enveloperReader, int maxSizeOfHeaders, MessageVersion version);

И код будет выглядеть примерно так:

string requestMessageString = @"<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
        xmlns:inf="http://www.informatica.com/"
        xmlns:wsdl="http://www.informatica.com/wsdl/">
    <soapenv:Header>
        <inf:Security>
            <UsernameToken>
                <Username>john</Username>
                <Password>jhgfsdjgfj</Password>
            </UsernameToken>
        </inf:Security>
    </soapenv:Header>
    <soapenv:Body>
        <wsdl:doClient_ws_IbankRequest>
            <wsdl:doClient_ws_IbankRequestElement>
                <!--Optional:-->
                <wsdl:Client_No>00460590</wsdl:Client_No>
            </wsdl:doClient_ws_IbankRequestElement>
        </wsdl:doClient_ws_IbankRequest>
    </soapenv:Body>
</soapenv:Envelope>";

XmlReader envelopeReader = XmlReader.Create(new StringReader(requestMessageString));
Message requestMsg = Message.CreateMessage(envelopeReader, int.MaxValue, MessageVersion.Soap11);
...