Asp.net 如何检测web应用程序是否部署为虚拟目录?

Asp.net 如何检测web应用程序是否部署为虚拟目录?,asp.net,asp.net-mvc-3,iis,relative-path,virtual-directory,Asp.net,Asp.net Mvc 3,Iis,Relative Path,Virtual Directory,我的MVC3 Web应用程序并不总是作为IIS中的站点部署,因此我需要检测它是否已作为虚拟目录或应用程序部署,以便处理路径字符串 例如,如果站点部署为IIS根目录下的网站,如果我编写: \ABC\test.txt 这很好,请求转到http://somehost/ABC/test.txt 但如果站点部署为IIS中现有站点下的虚拟目录或应用程序,例如: http://somehost/mymvcapp/ 然后,对“\ABC\test.txt”的请求将不正确 我知道写“~\App\u Data\te

我的MVC3 Web应用程序并不总是作为IIS中的站点部署,因此我需要检测它是否已作为虚拟目录或应用程序部署,以便处理路径字符串

例如,如果站点部署为IIS根目录下的网站,如果我编写:

\ABC\test.txt

这很好,请求转到
http://somehost/ABC/test.txt

但如果站点部署为IIS中现有站点下的虚拟目录或应用程序,例如:

http://somehost/mymvcapp/
然后,对“\ABC\test.txt”的请求将不正确

我知道写“~\App\u Data\test.txt”可以解决这个问题,但是“~\”只能由服务器在当前web上下文中处理。有时我需要对其他层中的文件进行一些处理,因为它们无法触及web上下文


因此,我需要检测应用程序是否已部署为虚拟目录。并找到文件的实际物理路径。有什么方法可以做到吗?

如果您的业务层无法引用
System.Web
,那么您必须期望它无法检测到有关您的Web应用程序周期的任何信息。这意味着代码不应解析站点中的文件路径

相反,您可以使用一个中间配置层来初始化应用程序,业务层可以使用它。例如,给定两层都可以访问的接口:

public interface IConfiguration
{
    string DataFolder { get; }
}
。。。您的
Global.asax
中可以有初始化它的代码:

IConfiguration config = ...;
...
config.DataFolder = this.Server.MapPath("~/App_Data");
您的业务层现在可以读取配置并形成预期文件的路径:

var filePath = Path.Combine(this.configuration.DataFolder, "test.txt");

如果您的业务层无法引用
System.Web
,那么您必须期望它无法检测到有关您的Web应用程序周期的任何信息。这意味着代码不应解析站点中的文件路径

相反,您可以使用一个中间配置层来初始化应用程序,业务层可以使用它。例如,给定两层都可以访问的接口:

public interface IConfiguration
{
    string DataFolder { get; }
}
。。。您的
Global.asax
中可以有初始化它的代码:

IConfiguration config = ...;
...
config.DataFolder = this.Server.MapPath("~/App_Data");
您的业务层现在可以读取配置并形成预期文件的路径:

var filePath = Path.Combine(this.configuration.DataFolder, "test.txt");

找到了一种方法,但我不确定它是否好:


检查HttpRuntime.AppDomainAppVirtualPath==“/”

找到了一种方法,但我不确定它是否好:


当您说“在其他层中对文件执行某些处理”时,请选中http://HttpRuntime.AppDomainAppVirtualPath==“/”

,您的确切意思是什么?您需要访问与应用程序相关的内容才能了解有关它的任何信息。您的意思是说您正在生成一个线程,而该线程没有在web请求的上下文中运行?“还是一个完全不同的过程?”雅各布我没有说清楚。我只需要将物理文件路径传递到业务层。因为不允许业务层使用system.web。我发现,如果我使用Server.MapPath(@“\..”),如果将网站部署为附加到IIS中现有站点的应用程序或虚拟目录,则结果将是错误的。Server.MapPath(@“~\..”)是正确的,但是有一些语句我不能用“~\”来代替“\”。@Jacob css的家伙写了一些类似于background image:url(“/Images/…”)的东西,在UI层中有很多这样的缺陷。很难描述这种情况,我不能在路径中插入“~”。我只需要得到当前站点路径的绝对路径。然后我可以自己组合路径。我想我可以先获取Server.MapPath(@“~\”),然后尝试组合路径。不管怎样,谢谢。当你说“在其他层对文件进行一些处理”时,你的确切意思是什么?您需要访问与应用程序相关的内容才能了解有关它的任何信息。您的意思是说您正在生成一个线程,而该线程没有在web请求的上下文中运行?“还是一个完全不同的过程?”雅各布我没有说清楚。我只需要将物理文件路径传递到业务层。因为不允许业务层使用system.web。我发现,如果我使用Server.MapPath(@“\..”),如果将网站部署为附加到IIS中现有站点的应用程序或虚拟目录,则结果将是错误的。Server.MapPath(@“~\..”)是正确的,但是有一些语句我不能用“~\”来代替“\”。@Jacob css的家伙写了一些类似于background image:url(“/Images/…”)的东西,在UI层中有很多这样的缺陷。很难描述这种情况,我不能在路径中插入“~”。我只需要得到当前站点路径的绝对路径。然后我可以自己组合路径。我想我可以先获取Server.MapPath(@“~\”),然后尝试组合路径。无论如何谢谢你。我记得你说过你不能引用
System.Web
@Jacob是的,这个代码在Web层。我将根据(HttpRuntime.AppDomainAppVirtualPath==“/”)向业务层发送不同的路径值。我觉得这不太好。@EdiWang:或者你可以在某个地方创建一个静态变量,然后在web启动时设置这个值。。。无论如何,谢谢你的回答,这对我很有帮助。我记得你说过你不能引用
System.Web
@Jacob是的,这个代码在Web层。我将根据(HttpRuntime.AppDomainAppVirtualPath==“/”)向业务层发送不同的路径值。我觉得这不太好。@EdiWang:或者你可以在某个地方创建一个静态变量,然后在web启动时设置这个值。。。无论如何,谢谢你的回答,这对我很有帮助。我看了一下,在blogene.Core/Utils.cs/line203中。它使用web.config来处理虚拟路径。看来这是唯一的办法。谢谢你的回答。我看了一下,在blogene.Core/Utils.cs/line203中。它使用web.config来处理虚拟路径。看来这是唯一的办法。谢谢你的回答。