继承 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")]
我正试图让它在我的 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")]