Vra

Ek is die bou van 'n reeks van WCF Services wat gebruik gaan word deur meer as een aansoek. As gevolg van wat ek probeer om 'n gemeenskaplike biblioteek definieer om toegang te verkry tot WCF dienste.

Die wete dat elke diens versoek deur verskillende gebruikers 'n ander kanaal Ek dink in die kas die Channel per-versoek (HttpContext.Current.Items) moet gebruik en kas die ChannelFactory gebruik om die kanaal per Aansoek (HttpApplication.Items), want ek kan skep skep meer as een kanaal met dieselfde ChannelFactory.

Ek het egter 'n vraag oor hierdie kas meganisme wanneer dit kom by die sluiting van die ChannelFactory en Channel.

  1. Moet ek die kanaal te sluit nadat dit gebruik word, aan die einde van die versoek, of is dit ok om dit daar te laat om gesluit (?) Wanneer die konteks van daardie versoek sterf?
  2. Wat van ChannelFactory? Aangesien elke kanaal is wat verband hou met die ChannelFactory dat dit geskep, is dit veilig om dieselfde ChannelFactory tydens die lewe van die aansoek proses (AppDomain) hou?

Dit is die kode wat ek gebruik om hierdie te bestuur:

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

Dankie!

Was dit nuttig?

Oplossing

Die ideaal die kanaal te sluit sodra jy klaar is met dit. Dit sal dit terug te plaas in die kanaal swembad so dit kan gebruik word deur 'n ander werker draad.

Ja, die kanaal fabriek (die duur bietjie) kan vir die leeftyd van die aansoek bly.


Update

As van Net 4.5 is daar 'n ingeboude in die kas opsies vir fabrieke ChannelFactory kas NET 4.5

Ander wenke

Dit is 'n eenkant. Hoekom gebruik jy sessie-as 'n konteks sleutel? Die context.Items is uniek per versoek. Dit is:

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

moet funksioneel ekwivalent wees om:

HttpContext.Current.Items["ListOfOpenedChannels"]
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top