ASP.NETクライアントアプリケーションでのWCF ChannelFactoryとチャネルキャッシング

StackOverflow https://stackoverflow.com/questions/1825990

質問

複数のアプリケーションで使用される一連のWCFサービスを構築しています。そのため、WCFサービスにアクセスするための共通ライブラリを定義しようとしています。

異なるユーザーによって行われた各サービスリクエストは、チャンネルごとのリクエスト( HttpContext.Current.Items )でキャッシュしていると考えている異なるチャンネルを使用する必要があることを知っており、同じ ChannelFactory で複数のチャネルを作成できるため、アプリケーションごとのチャネル( HttpApplication.Items )。

ただし、ChannelFactoryとChannelを閉じる際には、このキャッシュメカニズムに関する質問があります。

  1. チャンネルを使用した後、リクエストの最後にチャンネルを閉じる必要がありますか、それともリクエストのコンテキストが終了したときにチャンネルを閉じたままにしておいても大丈夫ですか?
  2. ChannelFactoryはどうですか?各チャネルは、それを作成したChannelFactoryに関連付けられているため、アプリケーションプロセス(AppDomain)の存続期間中、同じChannelFactoryを保持しても安全ですか?

これは、これを管理するために使用しているコードです。

public class ServiceFactory
{
    private static Dictionary<string, object> ListOfOpenedChannels
    {
        get
        {
            if (null == HttpContext.Current.Items[HttpContext.Current.Session.SessionID + "_ListOfOpenedChannels"])
            {
                HttpContext.Current.Items[HttpContext.Current.Session.SessionID + "_ListOfOpenedChannels"] = new Dictionary<string, object>();
            }

            return (Dictionary<string, object>)HttpContext.Current.Items[HttpContext.Current.Session.SessionID + "_ListOfOpenedChannels"];
        }
        set
        {
            HttpContext.Current.Items[HttpContext.Current.Session.SessionID + "_ListOfOpenedChannels"] = value;
        }
    }

    public static T CreateServiceChannel<T>()
    {
        string key = typeof(T).Name;

        if (ListOfOpenedChannels.ContainsKey(key))
        {
            return (T)ListOfOpenedChannels[key];
        }
        else
        {
            ChannelFactory<T> channelF = new ChannelFactory<T>("IUsuarioService");
            T channel = channelF.CreateChannel();
            ListOfOpenedChannels.Add(key, channel);
            return channel;
        }
    }
}

ありがとう!

役に立ちましたか?

解決

チャンネルを使い終わったらすぐに理想的に閉じます。これにより、チャネルプールに戻され、別のワーカースレッドで使用できるようになります。

はい、チャネルファクトリ(高価なビット)は、アプリケーションの存続期間中は残ります。


更新

.Net 4.5以降、工場用の組み込みキャッシュオプションがあります。 ChannelFactory Caching .NET 4.5

他のヒント

これは別です。 SessionIDをコンテキストキーとして使用するのはなぜですか? context.Itemsはリクエストごとに一意です。つまり:

HttpContext.Current.Items[HttpContext.Current.Session.SessionID +"_ListOfOpenedChannels"]

機能的には次と同等です:

HttpContext.Current.Items["ListOfOpenedChannels"]
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top