سؤال

أنا بناء سلسلة من خدمات WCF التي سوف يتم استخدامها من قبل أكثر من تطبيق واحد.بسبب أنني أحاول تعريف المكتبة العامة للوصول إلى خدمات WCF.

مع العلم أن كل خدمة طلب المختلفة يجب على المستخدمين استخدام قناة مختلفة أفكر في ذاكرة التخزين المؤقت القناة لكل طلب (HttpContext.Current.Items) و ذاكرة التخزين المؤقت ChannelFactory المستخدمة في إنشاء القناة في تطبيق (HttpApplication.Items) منذ يمكنني إنشاء أكثر من قناة واحدة مع نفس ChannelFactory.

ولكن لدي سؤال بخصوص ذاكرة التخزين المؤقت هذه الآلية عندما يتعلق الأمر إلى إغلاق ChannelFactory القناة.

  1. هل أنا بحاجة إلى إغلاق القناة بعد استخدامه ، في نهاية الطلب ، أو هو موافق على ترك الأمر هناك إلى أن تكون مغلقة (?) عندما سياق هذا الطلب يموت ؟
  2. ماذا عن ChannelFactory?لأن كل قناة يرتبط مع ChannelFactory الذي قام بإنشائه هو آمن للحفاظ على نفس 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 التخزين المؤقت .NET 4.5

نصائح أخرى

هذا هو جانبا.لماذا تستخدم SessionID كما سياق المفتاح ؟ السياق.العناصر هي فريدة من نوعها في الطلب.وهذا هو:

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

يجب أن يكون وظيفيا الى:

HttpContext.Current.Items["ListOfOpenedChannels"]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top