1

当社のソフトウェアのネットワークアーキテクチャにより、当社のアプリケーションサーバーはお客様のWebサービスに直接接続できません。このため、アプリケーションサーバーと顧客のサーバーの間に統合サーバーがあります。この統合サーバーは、プロキシWebサービスをホストします。問題は、必要な資格情報とその他の追加情報を、アプリケーションサーバーのデータベースから統合サーバーのプロキシWebサービスに渡す必要があることです。

APIを汚染して、各Webサービスリクエストのクレデンシャルと追加情報を含むオブジェクトを渡したくありません。さらに、自由にシャットダウンできる複数の統合サーバーがあるため、後続のWebサービス要求が別の統合サーバーに渡される可能性があるため、クレデンシャルやその他の情報を使用してWebサービスを別の方法で初期化することはできません。

各メソッドのWebサービスインスタンスに情報を渡すために使用できるSoapExtensionの種類を追加する方法はありますか?そうでない場合は、各Webメソッドに引数を追加し、それを使用して情報を渡す以外に、他にできることはありますか?

4

1 に答える 1

1

答えは実際には非常に明白でした。

まず、SoapHeaderから派生したクラスを作成する必要があります。このクラスは、すべての資格情報およびその他の追加情報を格納するために使用されます。説明を簡単にするために、このクラスにCredentialContainerという名前を付けましょう。

実際のWebサービスクラスでは、CredentialContainerタイプの新しいパブリックプロパティを追加する必要があります。この例のプロパティの名前はContainerです。

最後に、WebMethod属性を持つ各メソッドにSoapHeaderという新しい属性を追加する必要があります。これは、SOAPメッセージのヘッダーで渡された情報をCredentialContainerインスタンスに転送することを処理します。Webサービスリクエストごとに新しいWebサービスインスタンスが作成されるため、複数のWebサービスリクエストが同時に発生してもリスクはありません。

サンプルコードは次のとおりです。

[WebService]
public class ExampleWebService
{
    public CredentialContainer Container { get; set; }

    [WebMethod]
    [SoapHeader("Container")]
    public void PerformSomething(string value)
    {
        var actualWebServiceClient = new MyWebServiceClient(Container.Url, ...);
        actualWebServiceClient.SendValue(value);
    }
}

public class CredentialContainer : SoapHeader
{
    public string Url { get; set; }
    ...
}
于 2012-11-16T12:53:21.217 に答える