2009-10-20 10 views
4

En utilisant HttpContext.Current.Request.ServerVariables [ "SERVER_NAME"] en mode intégré donne une erreur dans IIS7 selon: http://mvolo.com/blogs/serverside/archive/2007/11/10/Integrated-mode-Request-is-not-available-in-this-context-in-Application_5F00_Start.aspxremplacement pour HttpContext.Current.Request.ServerVariables [ "SERVER_NAME"] en mode intégré

Est y at-il un remplacement que je peux utiliser dans le code global.asax pour HttpContext.Current.Request.ServerVariables ["SERVER_NAME"]?

Ce serait similaire à l'utilisation

String strPath = 
HttpContext.Current.Server.MapPath(HttpRuntime.AppDomainAppVirtualPath); 

au lieu de

//String strPath = 
HttpContext.Current.Server.MapPath(HttpContext.Current.Request.ServerVariables["PATH_INFO"]); 

Répondre

5

Comme il n'y a pas de contexte de demande dans le pipeline pendant l'application plus commencer, je ne peux pas imaginer qu'il ya un moyen de deviner ce que serveur/port la prochaine demande réelle pourrait entrer.

Voici ce que j'utilise lorsque je ne suis pas en mode classique. Les frais généraux sont négligeables.

/// <summary> 
/// Class is called only on the first request 
/// </summary> 
private class AppStart 
{ 
    static bool _init = false; 
    private static Object _lock = new Object(); 

    /// <summary> 
    /// Does nothing after first request 
    /// </summary> 
    /// <param name="context"></param> 
    public static void Start(HttpContext context) 
    { 
     if (_init) 
     { 
      return; 
     } 
     //create class level lock in case multiple sessions start simultaneously 
     lock (_lock) 
     { 
      if (!_init) 
      { 
       string server = context.Request.ServerVariables["SERVER_NAME"]; 
       string port = context.Request.ServerVariables["SERVER_PORT"]; 
       HttpRuntime.Cache.Insert("basePath", "http://" + server + ":" + port + "/"); 
      } 
     } 
    } 
} 

protected void Session_Start(object sender, EventArgs e) 
{ 
    //initializes Cache on first request 
    AppStart.Start(HttpContext.Current); 
} 
Questions connexes