複数のアプリケーションで使用される一連の WCF サービスを構築しています。そのため、WCF サービスにアクセスするための共通ライブラリを定義しようとしています。
異なるユーザーによって行われた各サービス要求は異なるチャネルを使用する必要があることを知っているので、要求ごとにチャネルをHttpContext.Current.Items
キャッシュし ( )、アプリケーションごとにチャネルを作成するために使用される ChannelFactory をキャッシュすることを考えています ( HttpApplication.Items
)。同じChannelFactory
。
ただし、ChannelFactory と Channel を閉じるときのこのキャッシュ メカニズムについて質問があります。
- 使用された後、リクエストの最後にチャンネルを閉じる必要がありますか、それとも、そのリクエストのコンテキストが終了したときにチャンネルを閉じたまま (?) にしても問題ありませんか?
- チャンネルファクトリーはどうですか?各チャネルはそれを作成した 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;
}
}
}
ありがとう!