ASP.NET覆盖';405方法不允许';http响应

本文关键字:不允许 http 响应 方法 NET ASP 覆盖 | 更新日期: 2023-09-27 17:59:04

在ASP.NET WebAPI中,我有一个控制器/操作,可以使用GET谓词进行访问。如果我使用POST谓词查询端点,我会得到一个标准的405 method not allowed响应。

是否可以在不向控制器添加代码的情况下拦截这种行为并注入我自己的自定义响应而不是那个响应?或者可能以某种方式覆盖原始响应。这种行为预计会在应用程序范围内出现,所以我必须在全局范围内设置此设置。

ASP.NET覆盖';405方法不允许';http响应

405的这种行为是由管道寻找合适的控制器,然后通过命名约定或属性寻找合适的方法来确定的。我看到了两种方法来实现您想要的结果,一种是自定义的IHttpActionSelector,另一种是基本的ApiController。

IHttpActionSelector:的示例代码

public class CustomHttpActionSelector : IHttpActionSelector
{
    public HttpActionDescriptor SelectAction(HttpControllerContext controllerContext)
    {
        var isPostSupported = false;
        //logic to determine if you support the method or not
        if (!isPostSupported)
        {
            //set any StatusCode and message here
            var response = controllerContext.Request.CreateErrorResponse(HttpStatusCode.ServiceUnavailable, "Overriding 405 here.");
            throw new HttpResponseException(response);
        }
    }
    ...
}
//add it to your HttpConfiguration (WebApiConfig.cs)
config.Services.Add(typeof(IHttpActionSelector), new CustomHttpActionSelector());

基本ApiController的示例代码:

public abstract class BaseApiController<T> : ApiController
{
    public virtual IHttpActionResult Post(T model)
    {
        //custom logic here for "overriding" the 405 response
        return this.BadRequest();
    }
}
public class UsersController : BaseApiController<User>
{
    public override IHttpActionResult(User model)
    {
        //do your real post here
        return this.Ok();
    }
}