Frage

Ich baue eine Reihe von WCF-Diensten, die von mehr als eine Anwendung verwendet werden werden. Wegen der, dass ich versuche, eine gemeinsame Bibliothek zu definieren WCF-Dienste zugreifen zu können.

Das Wissen, dass jede Dienstanforderung von verschiedenen Benutzern einen anderen Kanal verwenden, soll ich im Cache des Kanal pro-Anforderung (HttpContext.Current.Items) und cachen den Channel denke verwendet, um den Kanal pro Applikation (HttpApplication.Items) zu schaffen, da kann ich mehr erstellen als ein Kanal mit der gleichen ChannelFactory.

Aber ich habe eine Frage bezüglich dieses Cache-Mechanismus, wenn es darum geht, der Channel und Kanal zu schließen.

  1. Muß ich den Kanal zu schließen, nachdem es am Ende der Anforderung verwendet wird, oder ist es in Ordnung, es dort zu lassen geschlossen werden (?), Wenn der Kontext dieses Antrags stirbt?
  2. Was ist Channel? Da jeder Kanal mit dem Channel verknüpft ist, das es erstellt, ist es sicher, den gleichen Channel während der Lebensdauer des Bewerbungsprozesses zu halten (AppDomain)?

Dies ist der Code Ich verwende diese zu verwalten:

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

Danke!

War es hilfreich?

Lösung

Im Idealfall um den Kanal schließen, sobald Sie damit fertig sind. Dadurch wird es zurück in den Kanal Pool legen, so kann sie von einem anderen Worker-Thread verwendet werden.

Ja, die Kanalfactory (die teure Bit) für die Lebensdauer der Anwendung bleiben.


Update

Wie von .Net 4.5 gibt es eine für Fabriken in Caching-Optionen gebaut Channel .NET 4.5

Andere Tipps

Dies ist eine Seite. Warum verwenden Sie SessionID als Kontextschlüssel? Die Context.Items ist einzigartig pro Anfrage. Das heißt:

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

sollte funktional äquivalent sein:

HttpContext.Current.Items["ListOfOpenedChannels"]
scroll top