ASP.NET Core在不允许方法时返回自定义响应

我正在使用ASP.NET Core来构建REST服务

如果用户尝试使用不支持的方法请求端点,我需要返回自定义响应代码。 例如,端点localhost / api / test仅支持GET方法,但用户使用POST方法请求它。 我需要返回404响应和自定义正文。

如何使用ASP.NET Core执行此操作?


UPD:

可能我错误地提出了我的问题。
如果不允许某个方法,我需要ASP Core返回405响应代码和自定义JSON主体。 这应该是一个标准的行为,但还没有实现(根据这个问题 )所以我希望解决方法返回405响应代码然而ASP Core不支持它开箱即用。

在控制器方法级别,这可能会指导您。 您可以使用首选的状态代码和消息创建HttpResonseMessage。 注意:如果您想要像302这样的状态,那么您还需要填写位置标题。

if (Request.Method.Method.Equals("POST", StringComparison.OrdinalIgnoreCase)) { IHttpActionResult response; HttpResponseMessage responseMsg = new HttpResponseMessage(HttpStatusCode.NotFound); responseMsg.Content = new StringContent("Method doesn't support POST or whatever", System.Text.Encoding.UTF8, "text/html"); response = ResponseMessage(responseMsg); return response; } 

假设您在控制器方法中添加自定义标头,以将其与框架响应区分开来。 在webapi.config中注册一个CustomMessageHandler。

 config.MessageHandlers.Add(new CustomMessageHandler()); 

//如下所示定义CustomMessageHandler并覆盖SendAsync

  public class CustomMessageHandler: DelegatingHandler { protected override Task SendAsync( HttpRequestMessage request, CancellationToken cancellationToken) { var reasonInvalid = String.Empty; var res= base.SendAsync(request, cancellationToken); if (res.Result.StatusCode == HttpStatusCode.NotFound || res.Result.StatusCode == HttpStatusCode.MethodNotAllowed) { if(!res.Result.Headers.Contains("CustomHeaderforIntentional404")) { res.Result.StatusCode = HttpStatusCode.MethodNotAllowed; res.Result.Content = new StringContent("Method doesn't support this method CUSTOM MESSAGE", System.Text.Encoding.UTF8, "text/html"); return res; } } return res; } } 

根据官方文件……

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/error-handling

 app.UseStatusCodePages(); // app.UseStatusCodePages(context => context.HttpContext.Response.SendAsync("Handler, status code: " + context.HttpContext.Response.StatusCode, "text/plain")); // app.UseStatusCodePages("text/plain", "Response, status code: {0}"); // app.UseStatusCodePagesWithRedirects("~/errors/{0}"); // PathBase relative // app.UseStatusCodePagesWithRedirects("/base/errors/{0}"); // Absolute // app.UseStatusCodePages(builder => builder.UseWelcomePage()); // app.UseStatusCodePagesWithReExecute("/errors/{0}"); 

……这样的事情应该有效。