我试图向我的项目添加一个SoapExtension,它使用Web引用来调用Java Web服务。我的所有代码都在 .Net 4.0 中
我刚刚添加了一个空的肥皂扩展
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.
System.Web.Services.Protocols.SoapClientType.Invoke
方法抛出了一个Root element is missing.
异常(我已经打开了 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 响应。
这是怎么回事?
我认为这是因为进程消息方法为空。我遇到了完全相同的问题,我的进程消息方法仅处理序列化后的情况,一旦我在反序列化之前处理了该过程,一切正常:
case SoapMessageStage.BeforeDeserialize:
{
Copy(wireStream, appStream);
appStream.Position = 0;
break;
}