.NET MVC 5只有一个区域在IIS下无法运行

时间:2015-05-30 10:37:55

标签: asp.net asp.net-mvc iis asp.net-mvc-5 asp.net-mvc-routing

我的项目中有一个名为' Reports'的问题。当我尝试从该区域访问某些控制器时,我总是遇到404错误。当我在本地IIS(Windows 8.1)上运行我的应用程序时,只会出现此问题。在其他机器(Windows 7和本地IIS)上一切正常。即使在这台Windows 8.1机器上,但IIS Express一切运行良好。

我试图清除临时文件,但没有结果。

区域被注册如下:

public class ReportsAreaRegistration : AreaRegistration 
{
    public override string AreaName 
    {
        get 
        {
            return "Reports";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context) 
    {
        context.MapRoute(
            "Reports_default",
            "Reports/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional }
        );
    }
}

在Global.asax中,Application_start()方法:

AreaRegistration.RegisterAllAreas();

我不知道问题出在哪里。你有什么想法吗?

3 个答案:

答案 0 :(得分:1)

试试这个:

public class ReportsAreaRegistration : AreaRegistration 
{
    public override string AreaName 
    {
        get 
        {
            return "Reports";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context) 
    {
        context.MapRoute(
            "Reports_main",
            "Reports/{controller}/{action}/{id}",
            new { area = "Reports", controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
        context.MapRoute(
            "Reports_default",
            "Reports/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional }
        );
    }
}

Reports_default路由规则将Index设置为给定控制器的默认操作。

您需要添加另一个Reports_main规则,当您访问该区域的根目录时,该规则将设置默认控制器,例如/Reports。在此规则中,我假设默认控制器为Home,但您可以更改它以适合您的项目。

答案 1 :(得分:1)

Visual Studio的默认AreaRegistration脚手架不包含controller的默认值,这意味着需要在URL中提供控制器。

/Reports/Home // This works (if you have a home controller)

/Reports // This doesn't work

要使控制器可选,您需要提供默认值。

public class ReportsAreaRegistration : AreaRegistration 
{
    public override string AreaName 
    {
        get 
        {
            return "Reports";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context) 
    {
        context.MapRoute(
            "Reports_default",
            "Reports/{controller}/{action}/{id}",
            // Note that controller is defaulted to Home
            new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

另请注意,注册路由的顺序与为整个应用程序执行的顺序相同。通常,这意味着您必须在致电AreaRegistration.RegisterAllAreas()之前致电RouteConfig.RegisterRoutes(RouteTable.Routes)

Tasos提供的答案也可以,但配置错误:

  1. 指定AreaRegistration中的默认区域是多余且不必要的。
  2. Reports_default在他的示例中是一个无法访问的执行路径,这使得它也是多余的和不必要的。

答案 2 :(得分:0)

检查事件查看器。我遇到了这个问题,“报告”URL是一个与SQL Server Reporting Services有关的虚拟目录。