Pregunta

El HttpContext.Current.Request.ApplicationPath propiedad representa el directorio virtual en IIS o WebDev.WebServer.

 HttpContext.Current.Request.ApplicationPath evaluates to "/virtualdirectory"

Esto puede ser usado en conjunción con VirtualPathUtility para hacer una raíz ruta relativa:

 VirtualPathUtility.ToAbsolute("~/images/cat.jpg",
                               HttpContext.Current.Request.ApplicationPath)

 // (this evaluates to "/virtualdirectory/images/cat.jpg")

En IIS6 y WebDev.WebServer el objeto Request es disponible en global.asax.cs, pero IIS7 se queja de que es 'no está disponible en el contexto actual'. Por lo tanto, la segunda línea de código anterior funciona, pero no en IIS7.

El problema es que necesito para acceder al nombre directroy virtual dentro global.asax.cs. Lo necesito para construir algunos caminos que se utilizan en CSS creado de forma dinámica. ¿Hay una forma alternativa de acceder a este valor?

Editar Este es el error que se obtiene en IIS 7 para llamar HttpContext.Current.Request en global.asax.cs bajo Application_Start:

 HttpException (0x80004005): Request is not available in this context]
    System.Web.HttpContext.get_Request() +8789264
¿Fue útil?

Solución

Finalmente encontró la respuesta simple!

 HttpRuntime.AppDomainAppVirtualPath

Disponible inmediatamente durante Application_Start

Este es de la forma /myapplication incluyendo el prefijo /.

Otros consejos

Se puede utilizar ResolveUrl ( "~ / images / cat.jpg") para construir su camino?

Editar ResolveUrl es un método de control, no sólo la clase de página, por lo que puede hacerlo de esta manera en vez (tal vez poco feo):

System.Web.UI.Control c = new Control();
String s = c.ResolveUrl(@"~/images/cat.jpg");

Hmmm ... yo no era consciente del cambio IIS7. Me pregunto si no sería más simple para diferir esta operación hasta que Tienes tiene una página. Por ejemplo, usted podría intentar poner algo "una sola vez" en Application_BeginRequest o Session_Start?

O (completamente no probado) para un gancho de auto-unsubscribing:

    public override void Init() {
        base.Init();
        EventHandler handler = null;
        handler = delegate {
            // do stuff, once only
            this.BeginRequest -= handler;
        };
        this.BeginRequest += handler;
    }

El truco es hacerlo sólo una vez (si hay múltiples peticiones llegan a la vez); tal vez un ctor estática? Por ejemplo, creo que esto dispara una sola vez, y sólo cuando hay una página disponible en contexto:

    static class DelayedLoader {
        static DelayedLoader() {
            string s = VirtualPathUtility.ToAbsolute("~/images/cat.jpg",
                           HttpContext.Current.Request.ApplicationPath);
        }
        [MethodImpl(MethodImplOptions.NoInlining)]
        public static void Init() { }
    }
    public override void Init() {
        base.Init();
        EventHandler handler = null;
        handler = delegate {
            DelayedLoader.Init();
            this.BeginRequest -= handler;
        };
        this.BeginRequest += handler;
    }

Este es el mejor que se me ocurrió: Application_BeginRequest (a través de la marca)

Yo uso asax tan pocas veces que me había olvidado temporalmente se obtienen diferentes eventos con él. Hasta ahora había sido la creación de los sprites CSS en Application_Start. Moverlo a BeginRequest era lo mejor que podía ocurrir.

Uno de verificación booleana para cada petición es insignificante, pero sería bueno si hay una manera diferente.

  protected void Application_Start()
    {
        RegisterRoutes(RouteTable.Routes);
    }

    protected void Application_BeginRequest()
    {
        if (!_initialized)
        {
            lock (thisLock)
            {
                _initialized = true;
                GenerateCSSSprites();  
            }
        }
    }

tuve este problema también cuando se cambia a IIS7 pero pude refactorizar la necesidad de Solicitud. ¿Qué es lo que este hombre también sugiere y proporciona una solución si no se puede.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top