继承 Controller 时无法让 Route 在 ASP.Net Web API 2 中工作

Can't get Route to work in ASP.Net Web API 2 when inheriting Controller

我正试图让它在我的 ASP.Net Web API 2 应用程序中工作。你会注意到这个Controller继承了Controller。这是因为我需要 return 视图而不是 JSON。

[RoutePrefix("api/Manage")]
public class ManageController : Controller
{
  [Route("TestOne")]
  public async Task<ActionResult> MyTestOne(string value1, string value2)
  {
    return View("");
  {
}

这是我遇到的错误。

<error>
<MessageDetail> No type was found that matches the controller named 'Manage'.</MessageDetail>
</Error>

我需要像这样调用管理控制器。

https://api.domain.com/api/Manage/TestOne?value1=foo&value2=bar

我的RouteConfig是这样配置的。

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
       name: "Default",
       url: "{controller}/{action}/{id}",
       defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
       );

注意:[RoutePrefix("api/Account")] 在我的 AccountController 中有效。这是一个 API 控制器并继承了 ApiBase。

非常感谢任何帮助!谢谢!

发生这种情况是因为您有 2 个路由配置,一个用于 MVC 个控制器,一个用于 Web API。在你的情况下 Web API 路由配置首先进行。 Global.asax.cs 看起来像这样

//some configs
WebApiConfig.Register(GlobalConfiguration.Configuration);
//some configs
RouteConfig.RegisterRoutes(RouteTable.Routes);

而且您在 Web API 路由配置

中一定有这样的东西
config.MapHttpAttributeRoutes();

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

当您请求 /api/Manage/TestOne 时,Web API 路由首先应用。没有基于属性的路由适合,但请求与 DefaultApi 路由完美匹配。 Manage 匹配到 {controller}TestOne 匹配到 {id}。因此,框架开始搜索名称为 Manage 的 api 控制器,如下所示

public class ManageController : ApiController

但是没有这样的控制器,确实你有错误

{
    "Message": "No HTTP resource was found that matches the request URI 'http://host/api/Manage/TestOne/?value1=foo&value2=bar'.",
    "MessageDetail": "No type was found that matches the controller named 'Manage'."
}

所以我可以向您推荐一些可能的解决方案。

更改路由配置顺序

//some configs
RouteConfig.RegisterRoutes(RouteTable.Routes);
//some configs
WebApiConfig.Register(GlobalConfiguration.Configuration);

然后您的示例将按预期工作,但它可能会产生意外错误,因为我不知道您的应用程序中所有可能的路由。

移除DefaultApi路线

如果您完全依赖基于属性的路由 Web API 您可以删除此配置而不会对您的应用程序产生负面影响

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

或者只更改前缀

如果您将前缀从 api 更改为任何其他内容,它也会正常工作,因为它不再匹配 DefaultApi 路由

[RoutePrefix("view/Manage")]