ASP.NET 클라이언트 응용 프로그램의 WCF 채널 캐싱 및 채널 캐싱
-
22-07-2019 - |
문제
나는 둘 이상의 응용 프로그램에서 사용할 일련의 WCF 서비스를 구축하고 있습니다. 그로 인해 WCF 서비스에 액세스하기 위해 공통 라이브러리를 정의하려고합니다.
다른 사용자가 만든 각 서비스 요청을 알면 다른 채널을 사용해야합니다.HttpContext.Current.Items
) 및 애플리케이션 당 채널을 작성하는 데 사용되는 channelfactory를 캐시합니다 (HttpApplication.Items
) 동일하게 둘 이상의 채널을 만들 수 있기 때문에 ChannelFactory
.
그러나이 캐시 메커니즘이 Channeflactory와 채널을 닫을 때의 질문이 있습니다.
- 요청이 끝날 때 사용 후 채널을 닫아야합니까, 아니면 해당 요청의 컨텍스트가 사라질 때 닫히도록 맡겨 두어도 괜찮습니까?
- 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 기준 공장에 대한 캐싱 옵션이 내장되어 있습니다.Channeftactory 캐싱 .NET 4.5
다른 팁
이것은 제쳐두고 있습니다. SessionID를 컨텍스트 키로 사용하는 이유는 무엇입니까? Context.Items는 요청 당 고유합니다. 그건:
HttpContext.Current.Items[HttpContext.Current.Session.SessionID +"_ListOfOpenedChannels"]
기능적으로 동등해야합니다.
HttpContext.Current.Items["ListOfOpenedChannels"]
제휴하지 않습니다 StackOverflow