2012-05-15 37 views
6

我的Global.asax.cs的的Application_Start里面,我试图用得到当前应用程序路径:得到当前的应用程序虚拟路径在ASP.Net

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

这将返回例如:http://localhost:99/MySite/

我会然后使用这个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

不过,我想知道是否有人对如何做上述不改变该项目在经典模式下运行的任何想法。

+0

此外,这似乎是如何获得完整的主机名+端口号的副本中Global.aspx的的Application_Start?问题:http://stackoverflow.com/questions/4243270/how-to-get-full-host-name-port-number-in-application-start-of-global-aspx – JamieSee

回答

5

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

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

好的,有没有办法服务手动页面?例如var client = new WebClient(); client.DownloadData(Pages \ DummyPage.aspx) – MaYaN

+0

不,WebClient方法需要绝对URL。 –

+0

我明白了。现在Application_BeginRequest中的问题是,一旦应用程序启动,_BeginRequest事件不会被触发,直到用户登陆任何页面。这是一个问题,因为我需要在应用程序启动后立即打开页面。 – MaYaN

相关问题