Клиент веб-службы.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;
}