web-dev-qa-db-fra.com

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 cela a bien fonctionné sur ma machine locale, mais lors de la publication sur IIS7, il y a une exception disant

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

Quelqu'un sait comment y parvenir?

49
Leo

Lorsque votre application Web démarre, aucune demande HTTP n'est gérée.

Vous souhaiterez peut-être définir la méthode Application_BeginRequest (Object Sender, EventArgs e) dans laquelle le contexte Request est disponible.

Edit: Voici un exemple de code inspiré du blog de Mike Volodarsky auquel Michael Shimmins a lié:

    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;
        }
    }
60
cspolton

La réponse acceptée est bonne, mais dans la plupart des cas (si la première demande est une demande HTTP), il vaut mieux utiliser le Session_Start événement, 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 sera renvoyé à chaque demande.

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

Il suffit de répondre à cette question, donc 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)
2
Brandon Seydel