1

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

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

\ABC\test.txt

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

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

http://somehost/mymvcapp/

那么,“\ABC\test.txt”的请求将不正确。

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

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

4

2 回答 2

3

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

查看HttpRuntime.AppDomainAppVirtualPath == "/"

于 2012-08-02T02:40:02.777 回答
1

如果您的业务层无法引用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");
于 2012-08-02T02:35:01.357 回答