2010-01-29 21 views
7

Voglio eseguire un "processo in background" nella mia applicazione ASP.NET (periodicamente, come thread separato). E ho bisogno di nome host (nome DNS o IP) per svolgere i miei compiti. Il problema è che il HttpContext.Current potrebbe non essere disponibile qui (è NULL).Ottieni il nome host senza utilizzare HttpRequest

C'è un modo per ottenere un nome host in non usando HttpContext.Current.Request.Url.Host.

+1

inizialmente pensavo a Dns.GetHostName(), ma restituisce il nome host della macchina, non necessariamente l'URL dell'host della richiesta (cioè se si hanno più collegamenti in IIS). Se tutto ciò di cui hai bisogno è il nome host della macchina, puoi usare Dns.GetHostName() –

risposta

7

Quando il nome host è disponibile in HttpContext.Request.Url.Host, è il risultato del fatto che il nome host fa parte della richiesta inviata dal client. A titolo di esempio, prendere una richiesta a questa pagina:

 
GET /questions/2164261/get-host-name-without-using-httprequest HTTP/1.1 
Host: stackoverflow.com 
... 

Quando viene eseguito in un thread in background, senza contesto di richiesta è disponibile, e non c'è davvero alcun concetto di un nome host a tutti. L'unica alternativa è memorizzare il nome host nel codice o nella configurazione.

Argomento leggermente fuori luogo: l'esecuzione di attività pianificate all'interno di un'applicazione Web richiede problemi e i thread di spawning si occupano solo di alcuni di essi. Se possibile, prendere in considerazione l'esecuzione dei lavori pianificati da un servizio Windows, possibilmente costruito utilizzando un framework come NCron.

+3

+1 per il collegamento NCron, vorrei averlo saputo da un po 'di tempo fa. –

+1

Ciao Jorn, potresti entrare nei dettagli sul perché la pianificazione di lavori regolari in un thread in background è generalmente una cattiva idea? A patto che i lavori non siano molto intensivi in ​​termini di risorse e che non ci siano troppi fili preziosi lontano dal server, quale problema ti aspetteresti? Lo sto chiedendo perché recentemente ho sviluppato una soluzione del genere e non ho ancora avuto problemi. –

+0

@AdrianGrigore Il pool di app può essere riciclato in momenti imprevisti e in assenza di richieste che i dipendenti potrebbero non eseguire. Oltre a questo, ritengo anche questo possibile e in molti casi un approccio ragionevole. Mi piace soprattutto la facilità di implementazione che ne deriva. – John

1

probabilmente è possibile aggiungere una variabile di classe nella classe thread e impostare questa variabile con request.url.host prima di eseguire la classe thread.

questo metodo può essere applicato anche all'oggetto di sessione.

+0

In questo caso devo aspettare almeno una richiesta e solo dopo avviare il lavoro. Non bene. Cosa intendi per "applicare alla sessione"? Non ho accesso alla sessione, perché non ho HttpContext. –

1

Ricordare che è una cattiva idea avviare quel "processo in background" da un'applicazione Web se è necessario eseguire in background il processo in background 24 ore su 24, 7 giorni su 7. Anche se lo si avvia in una nuova discussione. La tua app web potrebbe non avere richieste per un po 'di tempo. In questo caso, il tempo di esecuzione spegne il processo e tutti i suoi thread "figlio". Per l'esecuzione continua è necessario eseguirlo come servizio di Windows. Altrimenti, Darren ha ragione, usa System.Net.Dns.GetHostName().

0

Utilizzo lo stesso approccio per la pianificazione di attività regolari e il modo in cui ho risolto questo problema è archiviare il nome del computer per un utilizzo successivo quando l'applicazione ottiene qualsiasi tipo di richiesta web.

Si tratta di un hack piuttosto sporco, ma l'unico modo per farlo a meno che non si desideri codificarlo o recuperarlo da un file di configurazione esterno, che era troppo pericoloso (inaffidabile) per i miei scopi.

Problemi correlati