6

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

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

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

  1. 使用された後、リクエストの最後にチャンネルを閉じる必要がありますか、それとも、そのリクエストのコンテキストが終了したときにチャンネルを閉じたまま (?) にしても問題ありませんか?
  2. チャンネルファクトリーはどうですか?各チャネルはそれを作成した 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;
        }
    }
}

ありがとう!

4

2 に答える 2

8

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

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


アップデート

.Net 4.5 の時点で、ファクトリ ChannelFactory Caching .NET 4.5のキャッシュ オプションが組み込まれています。

于 2009-12-01T12:52:50.673 に答える
1

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

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

機能的には次のものと同等である必要があります。

HttpContext.Current.Items["ListOfOpenedChannels"]
于 2010-03-03T16:00:00.120 に答える