2009-11-24 29 views
12

Qualcuno può dirmi se c'è un modo per me per ottenere il nome di dominio del mio sito nell'evento Application_Start nel global.asax?Global ASAX - ottenere il nome del server

Normalmente lo prendo da Context.Request.ServerVariables ["SERVER_NAME"], ma questo non è disponibile. Preferirei anche ottenere l'URL dalla richiesta che ha dato il via all'applicazione.


Hmm - dalle risposte di seguito, sembrerebbe che essere su IIS7 faccia la differenza qui. Questo è nuovo e ci sono ora linee guida di progettazione per cercare di si smette di farlo:

IIS Blog

risposta

21

È possibile accedere al Context attraverso la statica HttpContext.Current membro.

HttpContext.Current.Request.ServerVariables["SERVER_NAME"]; 
HttpContext.Current.Request.Url; 

Modifica, sulla base di alcuni dei vostri commenti ho fatto qualche ulteriore ricerca

Questo errore è dovuto ad una modifica di progettazione in cantiere IIS7 integrato che rende il contesto di richiesta disponibile in caso Application_Start. Quando si utilizza la modalità classica (l'unica modalità durante l'esecuzione su versioni precedenti di IIS), il contesto della richiesta era disponibile, anche se l'evento Application_Start è sempre stato inteso come evento globale e indipendente dalla richiesta nella durata dell'applicazione. Nonostante ciò, poiché le applicazioni ASP.NET sono sempre state avviate dalla prima richiesta all'app, era possibile accedere al contesto della richiesta tramite il campo statico HttpContext.Current.

in modo da avere due opzioni

  1. modificare il codice dell'applicazione non utilizzare il contesto di richiesta (consigliato).
  2. Sposta l'applicazione in modalità Classica (NON consigliata).

http://mvolo.com/iis7-integrated-mode-request-is-not-available-in-this-context-exception-in-applicationstart/

+2

Io non credo che ci sia un HttpContext in Application_Start – Luk

+2

@Luk - HttpContext.Current è un membro statico. Non importa in quale ambito ti trovi. È lì. Se hai problemi con questo, qualificalo completamente System.Web.HttpContext.Current – Bob

+4

Se faccio questo, ricevo un errore di runtime che indica che la Richiesta non è disponibile in questo contesto. La qualificazione non fa differenza. – Paddy

-3

Hai provato: -

System.Web.HttpContext.Current.Request.ServerVariables["SERVER_NAME"] 

Grazie,

Phil.

+0

+1 Sorprendentemente funziona anche in 'Application_Start' dove' HttpContext.Current.Request' è 'null'. Si scopre che 'ServerVariables' è una variabile statica (nota anche come globale). – Andomar

+4

-1: Nelle circostanze di Q (IIS> = 7 e modalità integrata), ciò fallirà allo stesso modo. – Richard

4

Immagino che tu sia su IIS 7? Perché HttpContext è disponibile lì su IIS 6.0.

Riesci a considerare di riempire tali informazioni in seguito? La prima chiamata a Application_BeginRequest per esempio?

+0

Sono su IIS7, che interessante ... Attualmente sto usando Application_BeginRequest, ma preferirei avere questo codice che ho bisogno di eseguire una volta nell'evento corretto. – Paddy

+0

@Downvoter: dove sbaglio? Sono abbastanza sicuro che non puoi accedervi prima di BeginRequest in IIS7 – Luk

+0

Avere una copia per annullarlo ... Sembrerebbe essere la risposta giusta. – Paddy

0

Avete accesso all'oggetto Richiesta? Se è così penso che potresti usare Request.Url.Authority

Restituirà il nome host di dns che è quello che stai cercando.

G

14

L'applicazione Web può essere eseguita in più domini diversi.Poiché non vi è alcuna richiesta corrente nell'evento Application_Start, non è possibile sapere in quale dominio verrà chiamata l'applicazione.

È tuttavia possibile trovare il nome macchina utilizzando System.Environment.MachineName.

3

In VB.NET, in Global.asax, io uso il seguente:

Hosting.HostingEnvironment.ApplicationHost.GetSiteName 

Corrisponde al nome dell'applicazione in IIS.

UPDATE: Sembra che il metodo di "GetSiteName" non è destinato ad essere chiamato direttamente e non funziona più per me in Visual Studio 2015 (o forse è perché il cambio di versione quadro che ho fatto). Ho riparato sostituendolo con:

System.Web.Hosting.HostingEnvironment.SiteName 
Problemi correlati