当asp.net 5 web api中出现代码错误时,返回500内部服务器错误

本文关键字:错误 返回 服务器 内部 代码 net asp web api | 更新日期: 2023-09-27 18:28:22

我的大多数函数都涉及检查是否存在某种东西。如果没有,我将返回HttpNotFound()。它们还包括检查参数是否正确。如果不是,我返回HttpBadRequest()。如果一切正常,我通常会返回OK(dataGoesHere)。

然而,当使用Try-Catch块并抛出错误时,我应该怎么做。在Catch中,我只想简单地返回一个服务器错误。我看到一些API实际上也返回了自定义消息。

在ASP.NET 5中,事情的处理方式似乎大不相同。我不能像webapi 2中那样返回BadRequest()、Conflict()等。

当asp.net 5 web api中出现代码错误时,返回500内部服务器错误

这是我的团队在公共应用程序中使用的,修改后返回InternalServerError,其中所有未批准的请求都由该控制器处理:

public class ErrorController : ApiController
{
    [HttpGet, HttpPost, HttpPut, HttpDelete, HttpHead, HttpOptions, AcceptVerbs("PATCH")]
    public HttpResponseMessage HandleErrors()
    {
        HttpResponseMessage message = new HttpResponseMessage();
        message.Content = new StringContent("<html><body><div>This is a custom message that will be displayed to the user in HTML format</div></body></html>");
        message.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("text/html");
        message.StatusCode = HttpStatusCode.InternalServerError;
        return message;
    }
}

除此之外,我们还使用了一个自定义的DefaultHttpControllerSelector和一个自定义ApiControllerActionSelector其中请求未知控制器和操作的请求由ErrorController检索。

编辑:添加另一个示例,假设要调用的Action(函数)返回IHttpActionResult,并且您只想返回关于发生了什么的信息,这就是返回一般错误消息的方法:

return InternalServerError(ex);

另一个示例,这比上一个稍微复杂一点,但为您提供了以所需格式发送所需详细信息的方法:

public class SomethingFailedResult : IHttpActionResult
{
    private HttpControllerContext _Context { get; set; }
    private string _Message { get; set; }
    public SomethingFailedResult(HttpControllerContext context, string message)
    {
        _Context = context;
        _Message = message;
    }
    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        return Task.FromResult(_Context.Request.CreateResponse(HttpStatusCode.InternalServerError,
            _Message, "someMediaType"));
    }
}

然后,您将在控制器中创建一个辅助方法,如下所示:

private SomethingFailedResult SomethingFailed(string contents, HttpControllerContext context)
{
    return new ExpectionFailedResult(contents, context);
}

当发生意外错误时,您应该记录异常并向用户发送通用消息。您可以为错误消息附加一个唯一的id,管理员或开发人员稍后可以在数据库中找到该id。

如果使用WebAPI 2.0

使用IHttpActionResult并返回InternalServerError,如下所示

public IHttpActionResult Get()
{
   return InternalServerError();
}

对于WebAPI 1.0,使用HttpResponse消息如下:-

return Request.CreateResponse(HttpStatusCode.InternalServerError);