【问题标题】:Can I access virtual directory name in global.asax.cs?我可以访问 global.asax.cs 中的虚拟目录名称吗?
【发布时间】:2009-04-28 20:42:13
【问题描述】:

HttpContext.Current.Request.ApplicationPath 属性表示 IIS 或 WebDev.WebServer 中的虚拟目录。

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

这可以与VirtualPathUtility 结合使用以使路径根相对:

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

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

在 IIS6 和 WebDev.WebServer 中,Request 对象 global.asax.cs 中可用,但 IIS7 抱怨它“在当前上下文中不可用”。因此,上面的第二行代码在 IIS7 中有效,但在 IIS7 中无效。

问题是我需要访问global.asax.cs 中的虚拟目录名称。我需要它来构造一些在动态创建的 CSS 中使用的路径。是否有其他方法可以访问此值?

编辑:这是您在 IIS 7 中调用 Application_Start 下 global.asax.cs 中的 HttpContext.Current.Request 时遇到的错误:

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

【问题讨论】:

  • 我没看懂问题, HttpContext.Current 在 global.asax 中可用,你问什么事件?
  • @deviant - HttpContext.Current 可用,但 HttpContext.Current.Request 不可用。我已经编辑了帖子以包含错误

标签: asp.net requestcontext


【解决方案1】:

终于找到了简单的答案!

 HttpRuntime.AppDomainAppVirtualPath

Application_Start 期间立即可用

这是/myapplication 的形式,包括/ 前缀。

【讨论】:

  • 如何获取目录全名?
  • 知道了! HttpRuntime.AppDomainAppPath
  • 您先生,西蒙·韦弗先生,您成功了。
【解决方案2】:

你可以使用 ResolveUrl("~/images/cat.jpg") 来构建你的路径吗?

编辑: ResolveUrl 是 Control 的方法,而不仅仅是 Page 类,所以你可以这样做(可能有点丑):

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

【讨论】:

    【解决方案3】:

    嗯...我不知道 IIS7 的变化。我想知道将这个操作推迟到您 获得一个页面之前是否会更简单。例如,您可以尝试在 Application_BeginRequestSession_Start 中添加“仅一次”的内容?

    或者(完全未经测试)自退订挂钩:

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

    诀窍是只做一次(如果多个请求同时到达);也许是静态演员?例如,我认为这只会触发一次,并且仅在上下文中有可用页面时触发:

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

    【讨论】:

    • Application_BeginRequest 可能是最安全的。我不确定 Session_Start 的生命周期,但是当我尝试使用它时,页面输出已损坏 - 我认为它与我的压缩冲突 - 这很奇怪,但我现在会坚持使用 Begin_Request
    【解决方案4】:

    这是我想出的最好的:Application_BeginRequest(通过标记)

    我很少使用 asax,以至于我暂时忘记了你会用它获得不同的事件。到目前为止,我一直在Application_Start 中创建 CSS 精灵。将它移到 BeginRequest 是我能想到的最好的方法。

    对每个请求进行一次布尔检查可以忽略不计,但如果有不同的方法会很好。

      protected void Application_Start()
        {
            RegisterRoutes(RouteTable.Routes);
        }
    
        protected void Application_BeginRequest()
        {
            if (!_initialized)
            {
                lock (thisLock)
                {
                    _initialized = true;
                    GenerateCSSSprites();  
                }
            }
        }
    

    【讨论】:

    • 请注意,如果两个请求足够接近,理论上似乎可以运行两次GenerateCSSSprites。不太可能,但是......您可能想要使用双重检查锁定(即检查锁内的 _initialized )或其他方法(例如静态 ctor 技巧)。
    • 哎呀。谢谢。我试图避免锁定每个请求并设法错过了。它很重要,因为两次运行 GenerateCSSSprites 实际上会导致异常,因为它会将项目添加到全局字典中,并且如果执行两次则会抱怨。谢谢
    • 当我最初尝试时它实际上确实运行了两次:GenerateCSSSprites(); _初始化=真。这有点奇怪,因为我是唯一一个点击该页面的人,即使我正在访问该主机上的多个资源,浏览器在第一个请求被呈现之前无法请求它们 - 所以 IIS7 必须制作多个“伪” '请求我的一个真正的请求。奇怪
    【解决方案5】:

    我在切换到 IIS7 时也遇到了这个问题,但我能够重构出对 Request 的需求。如果你不能,这也是这个人的建议并提供了一种解决方法。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-07
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      • 2011-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多