1

Web 参照を使用して Java Web サービスを呼び出すプロジェクトに SoapExtension を追加しようとしました。私のコードはすべて.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 応答だと思います。

ここで何が問題なのですか?

4

1 に答える 1

3

プロセスメッセージ方式が空だからだと思います。私はまったく同じ問題を抱えていました。私のプロセスメッセージメソッドはシリアル化後のケースのみを処理し、シリアル化解除前にプロセスを処理するとすぐに、すべてが正常に機能しています。

case SoapMessageStage.BeforeDeserialize:
{
    Copy(wireStream, appStream);
    appStream.Position = 0;
    break;
}
于 2012-10-31T03:59:21.637 に答える