2013-05-15 1 views
6

Ho un servizio WCF che ha ospitato in IISServiceHostFactory.CreateServiceHost si chiama tempo multiplo WCF

<%@ ServiceHost Language="C#" Debug="true" Service="MyService" Factory="InitializableServiceHostFactory" %> 

il mio problema è che il CreateServiceHost viene chiamato con ogni richiesta per il metodo MyService, che rendono il mio codice di inizializzazione che è scritto in CreateServiceHost si chiama multiplo.

+0

Che cos'è il "InstanceContextMode' del servizio? Inoltre, cosa stai facendo nel tuo codice di inizializzazione? È costoso e puoi memorizzarlo nella cache in modo da farlo solo una volta? – Tim

+0

InstanceContextMode = PerSession e il codice di inizializzazione potrebbe essere costoso e deve essere eseguito una volta sola. –

+0

Il risultato dell'inizializzazione è qualcosa che è possibile memorizzare nella cache? – Tim

risposta

2

Dopo aver controllato molto su questo problema, ho visto che è correlato alla compilazione dinamica ASP.NET, è ricompilare l'intero sito quando qualsiasi cosa all'interno della cartella Bin viene modificata, ma il mio servizio WCF scrive nella cartella temporanea all'interno della cartella Bin che rendono il sito ricompilato poi l'Application_Start ri-sparato, poi la InitializableServiceHostFactory ri-creare il servizio WCF

so che è un problema fittizio :(

0

sospettavo che l'host di servizio non era un istanza della classe di servizio, e Carlos Figueira ha confermato che nella sua risposta a [Is it necessary to Dispose() when using a custom ServiceHostFactory?].

Il CreateServiceHost() in fabbrica era stato chiamato più volte per la mia domanda, lanciando un ArgumentException la seconda volta che è stato inizializzato, con il messaggio:

The value could not be added to the collection, as the collection already contains an item of the same type: .... 

WCF volte riutilizza il servizio di accoglienza. Ho risolto il problema verificando se uno qualsiasi dei miei comportamenti personalizzati fosse già presente nell'elenco del Servicehost Description.Endpoints.Behaviors, quindi non ho inizializzato il mio host di servizio una seconda volta. In pratica, il mio caso era più semplice perché stavo impostando lo ServiceAuthorizationManager; se l'ho trovato già impostato, ho evitato di inizializzare di nuovo qualcosa.