在IIS7中从虚拟目录运行ASP.NET MVC应用程序

7
在IIS7中的虚拟目录中运行MVC应用程序是否可行?我已经在ASP.NET MVC3中构建了一个开源实用程序应用程序,并想知道是否犯了一个错误;如果该站点无法从虚拟目录运行,则可能是这样。如果从名为/app的虚拟目录运行简单的默认路由/home/index,实际上将是/app/home index。这会对路由造成一些混乱。我不希望用户更改路由并重新编译项目以在虚拟目录中使用该应用程序。是否有一种方法可以更改配置参数以指示应用程序的根文件夹是什么?
5个回答

23

在IIS7中从虚拟目录运行MVC应用程序是可能的,而且这是首选的方式。

使用Html helpers来处理url时可以解决路由问题。

以下是一种典型的不应该做的方法的例子:

<script type="text/javascript">
    $.ajax({
        url: '/home/index'
    });
</script>

下面是应该如何完成的方法:

<script type="text/javascript">
    $.ajax({
        url: '@Url.Action("index", "home")'
    });
</script>

这是另一个典型的例子,你永远不应该这样做:

<a href="/home/index">Foo</a>

这是正确的写法:

@Html.ActionLink("Foo", "Index", "Home")

这是另一个永远不应该做的示例:

<form action="/home/index" method="opst">

</form>

下面是正确的写法:

@using (Html.BeginForm("Index", "Home"))
{

}

我想你已经明白了。


1
@M4N,因为每个ASP.NET应用程序(无论是MVC还是其他)都必须驻留在虚拟目录中。如果您将其部署在站点根目录下,则该站点根目录仍然表示一个虚拟目录。 - Darin Dimitrov
1
好的,明白了。但是没有任何反对在站点根目录部署的内容。 - M4N
1
在类内部(不是控制器类或视图),我该调用什么来获取路径,例如/home/index? - Brettski
也有一些人会说"url: '@Url.Action("index", "home")'"也是不正确的 - 你应该使用 json 来获取 javascript 数据,并将其传递到 ajax 调用中,而不是混合代码类型。但我并不这样认为,我完全同意 Darin 在这里的做法(尽管有时razor解析由于脚本块中代码混杂而出现问题,但这些问题可以忽略)。 - Adam Tuliper
3
作为开发者,我们应该使用真正的工具,同样的工具也会在开发、测试或生产服务器上使用。为什么有人想要使用一些愚蠢的Cassini呢...它会导致问题,我不需要详细解释...你可以查一下。为什么不使用IIS才是问题所在。开发社区中有一群懒惰的家伙不想学习如何做好他们的工作...其中之一就是学习IIS,这样就可以了解应用程序池、页面处理程序等等。加入游戏,不要再使用糟糕的Cassini。那就是为什么。 - PositiveGuy
显示剩余7条评论

3

是的,这很好用,不会影响路由。但是,你运行的应用程序可能有漏洞,不支持该配置。

你不需要“配置参数”,因为IIS和ASP.NET已经正确处理了这个问题。

然而,你需要避免在视图中使用硬编码的URI。

例如,这样做:

<img src="<%: Url.Content("~/Content/Images/Image.png") %>" />

...而不是:

<img src="/Content/Images/Image.png" />

同样地,链接和样式表引用也是如此。


如何避免在样式表中使用硬编码的URI(用于背景图像、自定义字体等)?MVC助手函数在CSS文件中不可用... - user3163495

3
据我所知,路由都是基于应用程序根目录而不是实际根目录的,因此请将它们视为以~/开头,而不是/

2

是的,这个可以用。只要你使用帮助方法来创建操作URL(例如<%=Html.ActionLink(...) %>),就不需要重新配置或重新编译。


只要我在视图中使用辅助方法,ASP.NET MVC 就会知道它正在运行的位置,并从那里基于其 URL 和路由? - Brettski
@Brettski:没错(详见Darin的详细回答)。 - M4N

0

如果有人需要帮助,我遇到了一个问题,我的MVC操作是动态的,所以我不能使用.NET使用接受答案帖子中描述的方法为我生成正确的URL。我可以在服务器端使用“~/”,但无法在JavaScript等客户端使用。我的解决方案是编写一个共享方法,使用从以下获取的应用程序名称构建URL:

System.Web.HttpRuntime.AppDomainAppVirtualPath
示例:"/maint/Manage/Users",其中"maint"是我的应用程序名称,在某些服务器上可能不同,"Manage"是我的控制器名称,而"Users"是从数据库中获取的动态操作。
return string.Format("{0}/Manage/{1}", HttpRuntime.AppDomainAppVirtualPath, MenuName);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接