【问题标题】:ASP MVC 5 and Web Api 2 can't view page on complete linksASP MVC 5 和 Web Api 2 无法查看完整链接上的页面
【发布时间】:2016-01-21 08:17:09
【问题描述】:

我有 2 个控制器,1 个是 MVC,1 个是 Web Api 2。 后者似乎可以正常工作,但只有当我写完整地址时,第一个才能显示 HTML 页面。

这是我的简单RouteConfig.cs

routes.MapRoute(
    name: "Default",
        url: "{controller}/{action}",
        defaults: new {
            controller = "Base",
            action = "Main"
        }
    );
)

我们以默认为例,控制器为Base,动作为Main,代码直截了当

public ActionResult Main() {
    return View();
}

http://localhost/miApps --> /View/Base/Main 的工作和显示内容 http://localhost/miApps/Base --> /View/Base/Main 的工作和显示内容 http://localhost/miApps/Base/Main --> 不行,错误是

{"Message":"未找到与请求 URI 'http://localhost/miApps/Base/Main'匹配的 HTTP 资源。","MessageDetail":"未找到与名为 'Base' 的控制器匹配的类型。"}


我也发WebApiConfig.cs,也许有互动?

config.MapHttpAttributeRoutes();
    config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "{controller}/{action}",
        defaults: new {
            //id = RouteParameter.Optional
        }
    );
}

【问题讨论】:

  • 您在错误中提到的网址与您发布的不起作用的网址不同。你能用正确的细节更新问题吗?
  • 将您的路线更改为 - url: "miApps/{controller}/{action}" 为您的 default 路线,如果可行,请告诉我。
  • 它不起作用。 miApps 是 IIS 应用程序的名称,不应该包含在任何路由配置文件中,对吧?
  • 是的,你不应该。我认为这是您想要向端点发出请求的方式。所以在这种情况下,我认为您的路线没有任何问题,您的代码中可能还有其他问题。

标签: c# asp.net-mvc routing


【解决方案1】:

API 控制器的路由应该有一个前缀(通常是'/api/'),以便与普通控制器区分开来。

尝试将您的 WebApiConfig.cs 更新为:

config.MapHttpAttributeRoutes();
    config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{action}",
        defaults: new {
            //id = RouteParameter.Optional
        }
    );
}

【讨论】:

  • 这似乎是唯一可行的方法。我在 Api 控制器中添加了一个前缀,然后我添加了一个 Route 装饰以删除前缀的需要,所以在 WebApiConfig.cs 中我更改为 routeTemplate: "API/{controller}/{action}",然后在我的控制器中名为 Rest 的操作中名为 GetName 我添加属性[Route("Rest/GetName/{name?}")]。这个不太实用,希望有更好的解决方案
  • 您可以在 API 控制器上使用 [RoutePrefix] 属性,然后仅在带有参数的操作方法上使用 [Route]。例如[Route("{name}")]link
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-27
  • 1970-01-01
  • 2016-04-27
  • 2015-05-08
  • 1970-01-01
相关资源
最近更新 更多