2009-11-24 3 views
12

Quelqu'un peut-il me dire s'il y a un moyen pour moi d'obtenir le nom de domaine de mon site dans l'événement Application_Start dans global.asax?Global ASAX - obtenir le nom du serveur

Normalement, je l'obtiendrais simplement à partir de Context.Request.ServerVariables ["SERVER_NAME"], mais ce n'est pas disponible. Idéalement, j'aimerais également obtenir l'URL de la demande qui a lancé l'application. Hmm - d'après les réponses ci-dessous, il semblerait qu'être sur IIS7 fait une différence ici. Ce qui est nouveau et il y a maintenant des lignes directrices de conception pour essayer de vous empêcher de le faire:

IIS Blog

Répondre

21

Vous pouvez accéder par le membre HttpContext.Current statique du Context.

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

Edition, Basé sur certains de vos commentaires que je fait quelques recherches supplémentaires

Cette erreur est due à un changement de conception dans le pipeline intégré IIS7 qui rend le contexte de la demande disponible en cas Application_Start. Lors de l'utilisation du mode Classique (le seul mode en cours d'exécution sur les versions précédentes d'IIS), le contexte de demande était disponible, même si l'événement Application_Start avait toujours été conçu comme un événement global et indépendant de la demande. Malgré cela, parce que les applications ASP.NET étaient toujours démarrées par la première requête à l'application, il était possible d'accéder au contexte de la requête via le champ statique HttpContext.Current.

Alors vous avez deux options

  1. Changer votre code d'application pour ne pas utiliser le contexte de la demande (recommandé).
  2. Déplacez l'application en mode classique (NON recommandé).

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

+2

Je ne pense pas qu'il y ait un HttpContext dans Application_Start – Luk

+2

@Luk - HttpContext.Current est un membre statique. Peu importe la portée dans laquelle vous vous trouvez. C'est là. Si vous rencontrez des problèmes avec, le qualifier complètement System.Web.HttpContext.Current – Bob

+4

Si je fais cela, j'obtiens une erreur d'exécution indiquant que Request n'est pas disponible dans ce contexte. La qualification ne fait aucune différence. – Paddy

-3

Avez-vous essayé: -

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

Merci,

Phil.

+0

+1 Étonnamment, cela fonctionne même dans 'Application_Start' où' HttpContext.Current.Request' est 'null'. Il s'avère que 'ServerVariables' est une variable statique (alias global). – Andomar

+4

-1: Dans les circonstances du mode Q (IIS> = 7 & Integrated), cela échouera de la même manière. – Richard

4

Je suppose que vous êtes sur IIS 7? Parce que le HttpContext est disponible sur IIS 6.0.

Pouvez-vous envisager de remplir cette information plus tard? Le premier appel à Application_BeginRequest par exemple?

+0

Je suis sur IIS7, c'est intéressant ... J'utilise actuellement Application_BeginRequest, mais je préfère avoir ce code que j'ai besoin de lancer une fois dans l'événement correct. – Paddy

+0

@Downvoter: où est-ce que je me trompe? Je suis sûr que vous ne pouvez pas y accéder avant BeginRequest dans IIS7 – Luk

+0

Avoir un pour annuler cela ... Vous semblez être la bonne réponse. – Paddy

0

Avez-vous accès à l'objet Demande? Si oui, je pense que vous pourriez utiliser Request.Url.Authority

Il retournera le nom d'hôte DNS qui est ce que vous cherchez.

G

14

Votre application Web peut s'exécuter sous plusieurs domaines différents.Comme il n'y a pas de requête en cours dans l'événement Application_Start, vous ne pouvez pas savoir sous quel domaine l'application sera appelée. Vous pouvez cependant trouver le nom de la machine en utilisant System.Environment.MachineName.

3

En VB.NET, dans Global.asax, j'utilise les éléments suivants:

Hosting.HostingEnvironment.ApplicationHost.GetSiteName 

Il correspond au nom de l'application dans IIS. Il semble que la méthode "GetSiteName" n'est pas destinée à être appelée directement et qu'elle ne fonctionne plus pour moi dans Visual Studio 2015 (ou peut-être parce que la version de la structure que j'ai modifiée). Je l'ai fixé en le remplaçant par:

System.Web.Hosting.HostingEnvironment.SiteName