ASP.NET 5 API 向调用方返回异常
本文关键字:返回 异常 方返回 调用 NET API ASP | 更新日期: 2023-09-27 18:34:11
我正在从 ASP.NET 4.5 切换到 ASP.NET 5,并使用它来生成一些 RESTful Web 服务。在 4.5 中,我能够在操作中抛出异常并将其返回给调用方。我想在第 5 ASP.NET 这样做,但我还没有运气。我想避免在每个操作上使用尝试/捕获来完成此操作。
ASP.NET 来自 Visual Studio 的有关窗口的信息:ASP.NET 和 Web 工具 2015 (RC1 Update 1( 14.1.11120.0
这是我用来测试此内容的代码示例。
[Route("[controller]")]
public class SandController : Controller
{
/// <summary>
/// Test GET on the webservice.
/// </summary>
/// <returns>A success message with a timestamp.</returns>
[HttpGet]
public JsonResult Get()
{
object TwiddleDee = null;
string TwiddleDum = TwiddleDee.ToString();
return Json($"Webservice successfully called on {DateTime.Now}.");
}
}
我可以调用此操作并查看命中断点,但在调用端收到 500 错误代码,并且响应中没有正文。
编辑 1:
我更改了我的示例以反映这一点,但我想在遇到意外异常的情况下将异常信息返回给调用方,而不是我自己抛出的异常。代码是一个例子,我知道特定情况可以通过空引用检查来解决。
编辑 2:
@danludwig指出了生成此解决方案的中间件的MSDN文档:
private void ConfigureApp(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
app.UseIISPlatformHandler();
app.UseStaticFiles();
// Adding middleware to catch exceptions and handle them
app.Use(async (context, next) =>
{
try
{
await next.Invoke();
}
catch (Exception ex)
{
context.Response.WriteAsync($"FOUND AN EXCEPTION!: {ex.Message}");
}
});
app.UseMvc();
}
我想避免在每个操作上使用尝试/捕获来完成此操作。
https://docs.asp.net/en/latest/fundamentals/middleware.html
请注意,中间件还意味着您无需添加任何ExceptionFilterAttribute
您可以使用 ExceptionFilterAttribute
来实现这一点。对于要捕获的每种类型的异常,都需要一个。然后,您需要在FilterConfig.cs
中注册它
public class RootExceptionFilterAttribute : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext context)
{
if (context.Exception is Exception)
{
context.Response = new HttpResponseMessage(HttpStatusCode.InternalServerError);
// or...
// context.Response.Content = new StringContent("...");
// context.Response.ReasonPhrase = "random";
}
}
}