【问题标题】:Get The Current Application Virtual Path in ASP.Net在 ASP.Net 中获取当前应用程序虚拟路径
【发布时间】:2012-05-23 03:30:13
【问题描述】:

在 Global.asax.cs 的 Application_Start 中,我正在尝试使用以下方法获取当前应用程序路径:

var virtualPath = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority)
                          + HttpRuntime.AppDomainAppVirtualPath;

这将返回例如:@987654321@

然后我将使用此 URL 并执行以下操作:

var pageToHit = virtualPath + Pages\MyOtherPage.aspx 
var client = new WebClient();
client.DownloadData(dummyPageUrl);

当我在 IIS 6 或 Visual Studio 内置 Web 服务器中运行项目时,这一切都很好,但是在 IIS 7 中,当我收到“System.Web.HttpException: Request is not available in this context ”。

我知道这个帖子:Request is not available in this context

但是,我想知道是否有人知道如何在不将项目更改为以经典模式运行的情况下执行上述操作。

【问题讨论】:

标签: asp.net asp.net-mvc iis iis-7


【解决方案1】:

在集成模式下运行时,您无法在 Application_Start 中访问当前请求的绝对 url。您可以使用 HostingEnvironment.ApplicationVirtualPath 访问虚拟路径名,但不能使用绝对 url。这是an article,它解释了一种常见的解决方法。如文章中所述,您有两种可能性:

  1. 将您的应用程序代码更改为不使用请求上下文(推荐)
  2. 使用锁和单例在Application_BeginRequest 中执行初始化,以确保在 AppDomain 的整个生命周期内只执行一次此初始化。这是similar thread 讨论第二种方法。

【讨论】:

  • 好的,有没有手动提供页面的方法?例如 var client = new WebClient(); client.DownloadData(Pages\DummyPage.aspx)
  • 不,WebClient 方法需要绝对 url。
  • 我明白了。现在 Application_BeginRequest 的问题是,一旦应用程序启动, _BeginRequest 事件不会被触发,直到用户登陆任何页面。这是一个问题,因为我需要在应用程序启动后立即点击该页面。
  • 但是你不能点击Application_Start中的页面,因为在那个阶段你不知道这个页面的地址。此外,您的应用程序当前正在初始化,您正在尝试触发对其的请求。对我来说似乎是一个错误的方法。你想达到什么目的?为什么需要在 Application_Start 中点击这个页面?
  • 正确,但肯定应该有一种方法,因为这在 iis6 中是完全可能的,除非由于重大的架构更改而无法完成。
猜你喜欢
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 2012-11-26
  • 1970-01-01
  • 2016-02-28
  • 1970-01-01
  • 2021-08-15
相关资源
最近更新 更多