繁体   English   中英

继承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。 这是因为我需要返回一个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM