控制器ApiController上未找到任何操作
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了控制器ApiController上未找到任何操作相关的知识,希望对你有一定的参考价值。
对于我的API,我希望能够处理使用不正确的URL(即与任何控制器或操作不匹配的URL)进行调用的场景。
为此我已经实现了路由,以便它匹配任何路由:
config.Routes.MapHttpRoute(
name: "CatchAll",
routeTemplate: "{*any}",
defaults: new { controller = "Error", action = "Handler" }
);
我已经实现了控制器 - 操作如下:
[Route("api/v1/Handler")]
[ActionName("Handler")]
public HttpResponseMessage Get() {...}
当我提供错误的网址时,我会收到以下消息:
控制器“错误”上没有找到与“处理程序”名称匹配的操作
不确定错误在哪里。
简单方法:
您需要匹配操作名称。因此要么在Get
中将Handler
重命名为ErrorController
并删除属性,因为它们会与您映射的约定冲突。
public HttpResponseMessage Handler(string any) {...}
或改变行动从Handler
到Get
在Catch all MapHttpRoute
config.Routes.MapHttpRoute(
name: "CatchAll",
routeTemplate: "{*any}",
defaults: new { controller = "Error", action = "Get" }
);
不那么简单的方法:
以下是我使用属性路由和继承在web api中处理相同内容的方法。
首先,我创建了一个基本的api控制器,它将处理未知的操作。
public abstract class WebApiControllerBase : ApiController {
[Route("{*actionName}")]
[AcceptVerbs("GET", "POST", "PUT", "DELETE")]
[AllowAnonymous]
[ApiExplorerSettings(IgnoreApi = true)]
public virtual HttpResponseMessage HandleUnknownAction(string actionName) {
var status = HttpStatusCode.NotFound;
var message = "[Message placeholder]";
var content = new { message = message, status = status};
return Request.CreateResponse(status, content);
}
}
我的Api控制器都继承自这个基本控制器。
[RoutePrefix("api/customers")]
public class CustomersApiController : WebApiControllerBase {...}
鉴于您的问题包括RouteAttribute
,您应该已经在您的web api配置中使用MapHttpAttributeRoutes
。
但还有更多。要使框架识别继承的属性,您需要覆盖DefaultDirectRouteProvider
,如here所示
并在这里用于答案
WebAPI controller inheritance and attribute routing
public class WebApiCustomDirectRouteProvider : DefaultDirectRouteProvider {
protected override System.Collections.Generic.IReadOnlyList<IDirectRouteFactory>
GetActionRouteFactories(System.Web.Http.Controllers.HttpActionDescriptor actionDescriptor) {
// inherit route attributes decorated on base class controller's actions
return actionDescriptor.GetCustomAttributes<IDirectRouteFactory>(inherit: true);
}
}
并将其应用于web api配置。
// Attribute routing. (with inheritance)
config.MapHttpAttributeRoutes(new WebApiCustomDirectRouteProvider());
希望这可以帮助
以上是关于控制器ApiController上未找到任何操作的主要内容,如果未能解决你的问题,请参考以下文章
仅将操作过滤器添加到 [ApiController] 注释控制器的操作?
从 MVC 控制器动作调用 APIController 动作
公开 DTO 时的 ApiController 与 ODataController