gpt4 book ai didi

c# - 在 Controller ApiController 上未找到任何操作

转载 作者:行者123 更新时间:2023-11-30 16:49:48 26 4
gpt4 key购买 nike

对于我的 API,我希望能够处理使用不正确的 URL(即与任何 Controller 或操作不匹配的 URL)进行调用的情况。

为此,我实现了路由,以便它匹配任何路由:

config.Routes.MapHttpRoute(
name: "CatchAll",
routeTemplate: "{*any}",
defaults: new { controller = "Error", action = "Handler" }
);

我已经实现了 Controller - 操作如下:

[Route("api/v1/Handler")]
[ActionName("Handler")]
public HttpResponseMessage Get() {...}

当我提供错误的 URL 时,我收到消息:

No action was found on the controller 'Error' that matches the name 'Handler'

不知道哪里错了。

最佳答案

简单方法:

您需要匹配 Action 名称。因此,要么将 ErrorController 中的 Get 重命名为 Handler 并删除属性,因为它们会与您映射的约定冲突。

public HttpResponseMessage Handler(string any) {...}

或在 Catch all MapHttpRoute 中将操作从 Handler 更改为 Get

config.Routes.MapHttpRoute(
name: "CatchAll",
routeTemplate: "{*any}",
defaults: new { controller = "Error", action = "Get" }
);

不是那么简单的方法:

下面是我如何使用属性路由和继承在我的 web api 中处理相同的事情。

首先我创建了一个基本的 api Controller 来处理未知的操作。

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 Controller 都继承自这个基础 Controller 。

[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);
}
}

并将其应用于网络 API 配置。

// Attribute routing. (with inheritance)
config.MapHttpAttributeRoutes(new WebApiCustomDirectRouteProvider());

希望对你有帮助

关于c# - 在 Controller ApiController 上未找到任何操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35906677/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com