gpt4 book ai didi

c# - 从 MVC 6/Web Api Controller 返回错误字符串

转载 作者:太空狗 更新时间:2023-10-29 20:54:04 25 4
gpt4 key购买 nike

MVC6/WebApi 中的模板 WebApi Controller 实现了一个为 Get 方法返回集合的操作,如下所示:

[HttpGet]
public IEnumerable<MyEntity> Get()
{
//my code to return entities
}

假设我返回结果的代码抛出异常,我将如何向消费者返回错误消息?

据我所知,异常会导致 HTTP 500。这很好,但我想给调用者一条消息,告诉他出了什么问题。由于模板操作的签名,我无法捕获异常并返回一些 Http*** 或 ObjectResult 实例。

最佳答案

您需要自己添加一些代码来处理错误并返回消息。

一种选择是使用异常过滤器并将其添加到全局或选定的 Controller 上,尽管这种方法只能涵盖来自 Controller 操作方法的异常。例如,只有当请求接受是 application/json 时,下面的过滤器才会返回一个 json 对象(否则它会让异常通过,例如可以由全局错误页面处理):

public class CustomJSONExceptionFilter : ExceptionFilterAttribute
{
public override void OnException(ExceptionContext context)
{
if (context.HttpContext.Request.GetTypedHeaders().Accept.Any(header => header.MediaType == "application/json"))
{
var jsonResult = new JsonResult(new { error = context.Exception.Message });
jsonResult.StatusCode = Microsoft.AspNetCore.Http.StatusCodes.Status500InternalServerError;
context.Result = jsonResult;
}
}
}

services.AddMvc(opts =>
{
//Here it is being added globally.
//Could be used as attribute on selected controllers instead
opts.Filters.Add(new CustomJSONExceptionFilter());
});

另一种选择是您可以更改签名以更灵活地提供响应。然后您可以像往常一样处理错误,然后返回一条用户友好的错误消息。

public IActionResult Get() {
try {
IEnumerable<MyEntity> result;
//...result populated
return new HttpOkObjectResult(result);
} catch (Exception ex) {
//You should handle the error
HandleError(ex);//the is not an actual method. Create your own.
//You could then create your own error so as not to leak
//internal information.
var error = new
{
message = "Enter you user friendly error message",
status = Microsoft.AspNetCore.Http.StatusCodes.Status500InternalServerError
};
Context.Response.StatusCode = error.status;
return new ObjectResult(error);
}
}

关于c# - 从 MVC 6/Web Api Controller 返回错误字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35881221/

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