属性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中不行。
问题是我需要访问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发布于 2010-01-03 05:02:08
终于找到了简单的答案!
HttpRuntime.AppDomainAppVirtualPath在Application_Start期间立即可用
这是表单/myapplication,包括/前缀。
发布于 2009-04-28 20:48:11
您能使用ResolveUrl(“~/映像/cat.jpg”)构建您的路径吗?
编辑: ResolveUrl是一种控制方法,而不仅仅是页面类,所以您可以这样做(可能有点难看):
System.Web.UI.Control c = new Control();
String s = c.ResolveUrl(@"~/images/cat.jpg");发布于 2009-04-29 08:29:36
嗯..。我不知道IIS7的变化。我想知道把这个操作推迟到你有一页之后是否会更简单。例如,您可以尝试在Application_BeginRequest或Session_Start中放置“仅限一次”的内容。
或(完全未经测试的)自订钩子:
public override void Init() {
base.Init();
EventHandler handler = null;
handler = delegate {
// do stuff, once only
this.BeginRequest -= handler;
};
this.BeginRequest += handler;
}诀窍是只做一次(如果多个请求同时到达);也许是一个静态的ctor?例如,我认为这只会触发一次,并且只有在上下文中有一个可用的页面时:
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;
}https://stackoverflow.com/questions/799729
复制相似问题