2013-03-05 17 views
6

Ho accuratamente cercato Internet (la maggior parte dei link mi ha inviato a StackOverflow;)) per cercare di trovare una soluzione su come mantenere un servizio WCF attivo sotto IIS (7.5).Mantieni attivo un servizio WCF sotto IIS

Molte delle risposte qui suggerivano di scrivere un'applicazione che invierà periodicamente richieste fittizie al servizio WCF per mantenerlo attivo.

La mia domanda è: Cosa succede se creo un thread nel WCF che verrà avviato quando un servizio viene chiamato per la prima volta (in un costruttore statico) che consumerà periodicamente il WCF stesso?

voglio dire per esempio in C#:

while (true) 
{ 
    WebClient client = new WebClient(); 
    string returnString = client.DownloadString("http://..."); 
    Thread.Sleep(1000 * 5); 
} 

partendo dal presupposto che "http: // ..." è un URI per un WebMethod previsto che, per esempio restituisce qualche intero.

Questo funzionerebbe?

Fondamentalmente ho bisogno di un qualche tipo di servizio web (non particolarmente un WCF ma non un servizio di Windows) che gira su un server che esegue alcune operazioni e aggiorna qualcosa in un database di SQL Server. Quindi, se l'approccio descritto non funziona, quale potrebbe essere il modo migliore per raggiungere questo obiettivo?

+2

Per il tuo scenario? Sicuramente non WCF. Perché non utilizzare il servizio Win? –

+0

Perché anche a volte devo inviare alcuni dati su HTTP – kamilkp

+1

Ok. In che modo si escludono a vicenda? È possibile avere un servizio WCF AND Win, entrambi utilizzano la stessa libreria per la logica aziendale, ecc. In caso contrario, perché no? –

risposta

1

Vi suggerisco di creare un piccolo programma (app per console) che chiama il servizio web. Il programma dovrebbe prendere come argomenti l'url del servizio web. Quindi si crea un'attività pianificata di Windows che esegue il programma. In questo modo si ha molta flessibilità rispetto all'approccio embedded su cui si sta interrogando poiché il programma è solo un altro client del servizio web.

1

Cercare di evitare l'utilizzo del ciclo while. Forse lo http://quartznet.sourceforge.net/ è qualcosa che stai cercando. Su WCF avviare la creazione di Task ogni 10 minuti, che visualizzerà lo stesso WCF.

5

AppFabric permette di creare servizi WCF che può autostart ed essere lunga vita - questa potrebbe essere la pena di verificare come un opzione di hosting (è solo un plugin per IIS)

Auto Start

+0

Ho dimenticato di menzionare che lo sto distribuendo su qualche servizio di hosting gratuito su .NET (www.somee.com), quindi non posso davvero scherzare con IIS. – kamilkp

+0

Ah. Se volevi davvero provare la tua idea di thread che chiama il servizio, vale la pena guardare i servizi WF WCF, che supportano sleeps, convoy, etc - sebbene un servizio Windows sia un'opzione migliore – NDJ

+0

Se ospito il WCF sotto il servizio di Windows, la WCF sarà mantenuta viva in ogni momento? – kamilkp

9

Vai al tuo IIS -> Pool di applicazioni (o crearne uno nuovo) -> Impostazioni avanzate e impostare regolare intervallo di tempo = 0

enter image description here

Vedi filo legati here.

0

Quello che stai facendo è fondamentalmente sbagliato sin dall'inizio.

Il problema è questo: IIS è fondamentalmente un broker di richieste senza stato per le richieste HTTP (IIS di base) e un broker di richieste per le richieste di servizio (IIS con AppFabric).

Quello che stai chiedendo è come trasformare IIS intrinsecamente stateless in un server stateful, con thread eterni in esecuzione.

Questo non è ciò che IIS fa, IIS gestisce le richieste e il suo AppDomain è soggetto a AT TUTTI I TEMPI essere abbattuto (destorying di tutti i thread).

Ciò rende pericolosa la risposta più rivolta, in quanto insegna come influire sul processo di riciclo, senza controllare i tear-down (fuori dai domini dell'app e dai thread) che IIS eseguirà in modo intermittente.

Il richiedente è "estraneo" allo stesso IIS.

La durata interna del servizio è gestita interamente da IIS (e dalla configurazione delle sue applicazioni).

Quindi se con "keep alive" intendi: richiedere costantemente un servizio, quindi fare come Andreas suggerisce più avanti (creare un lavoro pianificato).

Se con "keep alive" si intende: per assicurarsi che la stessa istanza della classe gestisca le richieste, è necessario esaminare le durate della WCF.

Se con "keep alive" intendi: per rendere il codice che hai creato "stateful" e mantenere f.eks variabili statiche vivi e così via, beh non stai accettando che IIS è fondamentalmente un pr di stato. richiesta di broker con gestione della durata interna.

Problemi correlati