49 votes

Comment obtenir le nom d'hôte complet + le numéro de port dans Application_Start de Global.aspx ?

J'ai essayé

Uri uri = HttpContext.Current.Request.Url;
String host = uri.Scheme + Uri.SchemeDelimiter + uri.Host + ":" + uri.Port;

et il a bien fonctionné sur ma machine locale, mais lorsqu'il est publié sur IIS7, il y a une exception disant

System.Web.HttpException: Request is not available in this context

Quelqu'un sait-il comment y parvenir ?

60voto

cspolton Points 2771

Lorsque votre application Web démarre, aucune requête HTTP n'est traitée.

Vous voudrez peut-être gérer la définition de la méthode Application_BeginRequest(Object Sender, EventArgs e) dans laquelle le contexte de la demande est disponible.

Edit : Voici un exemple de code inspiré du blog de Mike Volodarsky auquel Michael Shimmins a fait référence :

    void Application_BeginRequest(Object source, EventArgs e)
    {
        HttpApplication app = (HttpApplication)source;
        var host = FirstRequestInitialisation.Initialise(app.Context);
    }

    static class FirstRequestInitialisation
    {
        private static string host = null;
        private static Object s_lock = new Object();

        // Initialise only on the first request
        public static string Initialise(HttpContext context)
        {
            if (string.IsNullOrEmpty(host))
            {
                lock (s_lock)
                {
                    if (string.IsNullOrEmpty(host))
                    {
                        var uri = context.Request.Url;
                        host = uri.GetLeftPart(UriPartial.Authority);
                    }
                }
            }

            return host;
        }
    }

10voto

Michael Shimmins Points 12740

Il semble que vous exécutez en mode intégré, et non en mode classique (ce que je pense que vous exécutez sur votre local).

Le problème est que Request n'est pas disponible dans Application_Start dans IIS7.

Jetez un coup d'œil :

http://mvolo.com/blogs/serverside/archive/2007/11/10/Integrated-mode-Request-is-not-available-in-this-context-in-Application_5F00_Start.aspx

Ce qui l'explique bien.

9voto

Vlad L Points 5458

La réponse acceptée est bonne, mais dans la plupart des cas (si la première requête est une requête HTTP), il est préférable d'utiliser la fonction Session_Start qui est appelé une fois par utilisateur toutes les 20 minutes environ (je ne sais pas combien de temps la session est valide). Application_BeginRequest seront tirés à chaque demande.

public void Session_Start(Object source, EventArgs e)
{
   //Request / Request.Url is available here :)
}

2voto

Brandon Seydel Points 91

Je réponds juste à cette question pour que si quelqu'un décide de faire une recherche sur ce sujet...

Cela fonctionne au démarrage de l'application dans n'importe quel mode...

typeof(HttpContext).GetField("_request", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(HttpContext.Current)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X