2

私のアプリケーションでは、Webサービスを呼び出しており、SoapExtensionとSoapExtensionAttributeを使用して、ログ記録の目的で着信および発信のSOAPメッセージをインターセプトできます。http://msdn.microsoft.com/en-us/magazine/cc164007.aspxの例を入力として使用しました。しかし今、私はさらに一歩進んでいきたいと思います。(別のプロジェクトで)クラスを呼び出すWindowsクライアントがあり、クラスがWebサービスを呼び出します。これでSOAPメッセージをインターセプトできますが、それらをファイルに直接ログに記録する代わりに、それらのメッセージをWebサービスを呼び出しているクラスに戻し、クラスを呼び出しているクライアントにも戻したいと思います。これまでに行ったコードの変更は次のとおりです。

        private String ExtractFromStream(Stream target)
    {
        if (target != null)
            return (new StreamReader(target)).ReadToEnd();

        return "";
    }

    public void WriteOutput(SoapMessage message)
    {
        newStream.Position = 0;
        string soapOutput = ExtractFromStream(newStream);

        newStream.Position = 0;
        Copy(newStream, oldStream);
    }

    public void WriteInput(SoapMessage message)
    {
        Copy(oldStream, newStream);

        newStream.Position = 0;
        string soapInput= ExtractFromStream(newStream);
        newStream.Position = 0;
    }

ここで、soapInputとsoapOutputを、この属性が適用されるメソッドを保持するクラスに戻したいと思います。私がそれをどのようにすべきかについての手がかりはありますか?

4

1 に答える 1

2

通りすがりの人のために、ここに解決策があります:

SoapMessageオブジェクトには、クライアントに関する情報が含まれていません。ただし、このオブジェクトをSoapClientMessageオブジェクトにキャストすると、Webサービスにアクセスできるようになります。このWebサービスにメソッドを追加すると(新しいパブリック部分クラスを作成することにより)、次のようにそのプロパティとメソッドにアクセスできます(純粋に例です!):

 private String ExtractFromStream(Stream target)
    {
        if (target != null)
            return (new StreamReader(target)).ReadToEnd();

        return "";
    }



    public void WriteOutput(SoapMessage message)
    {
        newStream.Position = 0;

        string soapOutput = ExtractFromStream(newStream);
        SoapClientMessage soapClient = (SoapClientMessage)message;
        WebServiceClass webservice = (WebServiceClass)soapClient.Client;
        webservice.MyMethod(soapOutput); //Use your own method here!


        newStream.Position = 0;
        Copy(newStream, oldStream);
    }

    public void WriteInput(SoapMessage message)
    {
        Copy(oldStream, newStream);           
        newStream.Position = 0;

        string soapInput= ExtractFromStream(newStream);
        SoapClientMessage soapClient = (SoapClientMessage)message;
        WebServiceClass webservice = (WebServiceClass)soapClient.Client;
        webservice.MyMethod(soapInput);
        newStream.Position = 0;
    }

新しいパブリック部分クラスを作成し、メソッド、プロパティなどを追加することで、WebServiceClassにメソッド(この例のMyMethodなど)を追加できます。

于 2010-11-10T11:23:45.653 に答える