![](/img/trans.png)
[英]ASP.NET Web API controller with attribute routing doesn't work without a route name
[英]Can't get Route to work in ASP.Net Web API 2 when inheriting Controller
我正在尝试使其在我的ASP.Net Web API 2应用程序中工作。 您会注意到该Controller继承了Controller。 这是因为我需要返回一个View而不是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")]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.