我使用ASP.NET Core构建REST服务
如果用户尝试使用不受支持的方法请求端点,我需要返回自定义响应代码。 例如,端点localhost / api / test仅支持GET方法,但用户使用POST方法请求它。我需要返回404响应和自定义正文。
如何使用ASP.NET Core执行此操作?
可能我错误地提出了我的问题 如果不允许方法,我需要ASP Core返回405响应代码和自定义JSON主体。 这应该是标准行为,但尚未实现(根据此issue) 因此,我希望解决方法返回405响应代码,但ASP Core不支持开箱即用。
答案 0 :(得分:1)
在控制器方法级别,这可能会指导您。您可以使用首选的状态代码和消息创建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<HttpResponseMessage> 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;
}
}
答案 1 :(得分:-1)
根据官方文档...
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}");
......这样的事情应该有用。