在IIS 6上部署Asp.Net MVC 2 /C# 4.0应用程序

14

我在从 VS.Net 2008 / MVC 1 迁移到 VS.NET 2010 (+C# 4.0) / MVC 2 的过程中遇到了问题。

Web.config 已经进行了更新,网站在 Cassini 上运行良好,但我的问题是在 IIS 6 上部署。

我已将网站更新为使用 ASP.Net 4,但无论尝试什么 URL,都会出现 404 错误。就好像路由没有被考虑进去一样(是的,通配符映射 已经完成)。

我不明白这个问题,也找不到任何有趣的信息......谢谢您的建议!


我尝试部署使用“添加新项目...”创建的默认项目,但遇到了相同的问题。仍在谷歌上寻找答案,但希望得到您的建议... - Mose
1
我总是被通配符映射和那该死的“验证文件是否存在”复选框搞糊涂。把所有东西都清除干净,从头开始,按照这个链接操作:http://blog.stevensanderson.com/2008/07/04/options-for-deploying-aspnet-mvc-to-iis-6/,并且当我说清除干净时,我的意思是彻底清除干净。不要假设某些东西是正确的。从头开始,三重检查每一步。 - user1228
我又试了一遍,但还是不行。 我正在处理的应用在MVC 1中完美运行,但自从我转到.Net 4 / MVC 2后,路由就出问题了... 正如我在之前的评论中所说,我尝试了示例应用程序,但无法使其工作。 感谢您的帮助。还有其他建议吗? - Mose
我有同样的问题,所有东西都显示404错误,我从头开始了。 - Jack Marchetti
值得注意的是,使用.NET 4后,在IIS6中不再需要isapi通配符映射来使无扩展名的URL正常工作。 http://blogs.msdn.com/tmarq/archive/2010/04/01/asp-net-4-0-enables-routing-of-extensionless-urls-without-impacting-static-requests.aspx - Mark Glasgow
4个回答

15

好的,我得到了答案(感谢我的同事)

当从ASP.Net 2.0迁移到ASP.Net 4.0时, 如果你遇到相同的问题, 那么请检查Web Service Extension中是否允许了ASP.Net v4。

在我的情况下,在安装了.Net Framework 4之后,它被禁止了。

Will和Mark:谢谢你们的帮助,希望能对其他人有所帮助。


6
我想我知道发生了什么:在IIS6上,除了通配符映射外,您还需要一个默认文档(Default.aspx),将文件夹请求路由到MVC处理程序。
MVC1项目模板中包含了一个默认文档,但是在MVC2中它已被删除

Default.aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="YourNameSpace._Default" %>

<%-- Please do not delete this file. It is used to ensure that ASP.NET MVC is activated by IIS when a user makes a "/" request to the server. --%>

Default.aspx.cs

using System.Web;
using System.Web.Mvc;
using System.Web.UI;

namespace YourNameSpace
{
    public partial class _Default : Page
    {
        public void Page_Load(object sender, System.EventArgs e)
        {
            // Change the current path so that the Routing handler can correctly interpret
            // the request, then restore the original path so that the OutputCache module
            // can correctly process the response (if caching is enabled).

            string originalPath = Request.Path;
            HttpContext.Current.RewritePath(Request.ApplicationPath, false);
            IHttpHandler httpHandler = new MvcHttpHandler();
            httpHandler.ProcessRequest(HttpContext.Current);
            HttpContext.Current.RewritePath(originalPath, false);
        }
    }
}

当你说“好像路由没有被考虑进去”,我怀疑实际上确实没有被考虑进去,这就是你的问题。

谢谢你的回答。不幸的是,我已经有一个几乎相同的代码后台的Default.aspx了。 我尝试使用你的代码(唯一的区别是最后的Rewritepath返回到原始路径),但它仍然不起作用。 尽管如此,我得到了一个很大的线索:当我尝试我的根URL(或该应用程序的任何URL)时,IIS非常快地返回404错误,即使在iisreset或服务器重新启动之后也是如此。我想它没有加载任何东西!使用C# 4.0检查问题。(FYI,URL为http://push.widgetbooster.com) - Mose
哇,我因为这个问题快疯了(我在 .net 3.5 中使用 MVC 2 和 IIS 6),但是这个解决方案解决了它!谢谢! - Francisco

2

这最终为我解决了问题:

我之前发表过评论,但有点仓促。我的评论是回复Mark B的帖子,使我的初始索引视图显示出来,但每当我导航到任何其他视图时,我仍然会遇到404错误。

我也被这个特定论坛中绿色勾选的解决方案所分心,但我在我的桌面上的IIS 6中甚至看不到Web服务器扩展文件夹;因此,我无法从那个角度控制启用aspnet 4.0,尽管我确保通过运行以下命令行进行了安装:

C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319> aspnet_regiis -i

现在是关于如何在除了主页/索引之外的其他视图中导航的实际部分:

在你的VS 2010解决方案的Global.asax.cs文件中,您将看到以下代码在RegisterRoutes方法中:

  routes.MapRoute(
      "Default", // Route name
      "{controller}/{action}/{id}", // URL with parameters
      new { controller = "Home", action = "Index", id = UrlParameter.Optional });

我只是在标签的 {action} 部分后面添加了 ".aspx",如下所示:
  routes.MapRoute(
      "Default", // Route name
      "{controller}/{action}.aspx/{id}", // URL with parameters
      new { controller = "Home", action = "Index", id = UrlParameter.Optional });

啊哈拉瓦拉花生酱和果冻三明治。:0)


0
如果您想在C#中实现此功能,只需添加System.DirectoryServices引用,这段代码就可以很好地完成工作。
DirectoryEntry w3svc = new DirectoryEntry("IIS://localhost/W3SVC");
w3svc.Invoke("EnableWebServiceExtension", "ASP.NET v4.0.30319");
w3svc.CommitChanges();

HTH


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