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();
}

ASP.NET 5 API 向调用方返回异常

我想避免在每个操作上使用尝试/捕获来完成此操作。

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";
        }
    }
}