Клиент веб-службы.Net SoapExtension испортил ответное сообщение от веб-службы Java

Я попытался добавить SoapExtension в мой проект, который использует веб-ссылку для вызова веб-службы Java. Весь мой код в.Net 4.0

Я только что добавил пустое SoapExtension

public class MyServiceSoapExtension : SoapExtension
{
    private Stream inwardStream;
    private Stream outwardStream;

    public override object GetInitializer(Type serviceType)
    {
        return serviceType;
    }

    public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)
    {
        return null;
    }

    public override void Initialize(object initializer)
    {
    }

    public override Stream ChainStream(Stream stream)
    {
        outwardStream = stream;
        inwardStream = new MemoryStream();
        return inwardStream;
    }

    public override void ProcessMessage(SoapMessage message)
    {
    }
}

И я добавил в app.config моего клиента:

<system.web>
    <webServices>
        <soapExtensionTypes>
            <add type="MyServiceClient.MyServiceSoapExtension, MyServiceClient" priority="1" />
        </soapExtensionTypes>
    </webServices>
</system.web>

Я считаю, что с кодом выше ничего не изменилось, когда я запустил его, я получил Response is not well-formed XML. Root element is missing. исключение брошено в System.Web.Services.Protocols.SoapClientType.Invoke метод (я включил отладку CLR). Если я удаляю конфигурацию в моем app.config, чтобы обойти SoapExtension, я могу получить любые результаты от сервера.

Я использовал Fiddler для отслеживания исходящих и отвечающих сообщений, я возвращаю SOAP с сервера

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <soap:Fault>
            <faultcode>soap:Client</faultcode>
            <faultstring>Unmarshalling Error: javax.xml.transform.stax.StAXResult </faultstring>
        </soap:Fault>
    </soap:Body>
</soap:Envelope>

Я считаю, что это правильный ответ SOAP.

Что здесь не так?

1 ответ

Я думаю, потому что метод сообщения процесса пуст. У меня была точно такая же проблема, мой метод сообщения процесса обрабатывал только случай после сериализации, и как только я обработал процесс перед десериализацией, все работает нормально:

case SoapMessageStage.BeforeDeserialize:
{
    Copy(wireStream, appStream);
    appStream.Position = 0;
    break;
}
Другие вопросы по тегам