문제

나는 둘 이상의 응용 프로그램에서 사용할 일련의 WCF 서비스를 구축하고 있습니다. 그로 인해 WCF 서비스에 액세스하기 위해 공통 라이브러리를 정의하려고합니다.

다른 사용자가 만든 각 서비스 요청을 알면 다른 채널을 사용해야합니다.HttpContext.Current.Items) 및 애플리케이션 당 채널을 작성하는 데 사용되는 channelfactory를 캐시합니다 (HttpApplication.Items) 동일하게 둘 이상의 채널을 만들 수 있기 때문에 ChannelFactory.

그러나이 캐시 메커니즘이 Channeflactory와 채널을 닫을 때의 질문이 있습니다.

  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;
        }
    }
}

감사!

도움이 되었습니까?

해결책

채널을 완료하자마자 채널을 이상적으로 닫으십시오. 이것은 다른 작업자 스레드에서 사용할 수 있도록 채널 풀에 다시 배치됩니다.

예, 채널 공장 (비싼 비트)은 응용 프로그램의 수명 동안 유지 될 수 있습니다.


업데이트

.NET 4.5 기준 공장에 대한 캐싱 옵션이 내장되어 있습니다.Channeftactory 캐싱 .NET 4.5

다른 팁

이것은 제쳐두고 있습니다. SessionID를 컨텍스트 키로 사용하는 이유는 무엇입니까? Context.Items는 요청 당 고유합니다. 그건:

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

기능적으로 동등해야합니다.

HttpContext.Current.Items["ListOfOpenedChannels"]
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top