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

C# ASP.NET 5 API向调用方返回异常,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我正在从ASP.NET4.5切换到ASP.NET5,并使用它生成一些RESTfulWeb服务。在4.5中,我能够在操作内部抛出异常,并将其返回给调用方。我想在ASP.NET5中实现这一点,但我还没有成功。我想避免在每一个动作上都使用Try/Catch来实现这一点 Visual Studio提供的有关Windows的ASP.NET信息:ASP.NET和Web工具2015(RC1更新1)14.1.11120.0 下面是我用来测试这一点的代码示例 [Route("[controller]")] pub

我正在从ASP.NET4.5切换到ASP.NET5,并使用它生成一些RESTfulWeb服务。在4.5中,我能够在操作内部抛出异常,并将其返回给调用方。我想在ASP.NET5中实现这一点,但我还没有成功。我想避免在每一个动作上都使用Try/Catch来实现这一点

Visual Studio提供的有关Windows的ASP.NET信息:ASP.NET和Web工具2015(RC1更新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}.");
    }
}

您可以通过使用
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";
        }
    }
}
我想避免在每一个动作上都使用Try/Catch来实现这一点


请注意,中间件还意味着您不需要添加任何
ExceptionFilterAttribute
s

您是否试图抛出异常并给出错误的详细消息,因为该代码也会返回给调用方,即使是500错误。我正在尝试将一个完整的异常以500错误转储到响应中。在4.5中,这似乎是默认行为,但在5.0.Fwiw中有所改变,您最好使用真正的中间件requestdelegate+扩展方法,而不是内联
应用程序。请使用
操作回调。对于造成的混淆,我深表歉意。我更新了我的问题,使之更清楚。我想向调用方返回意外异常,而不仅仅是我自己抛出的异常。明白了。。。您需要使用
异常过滤器属性
,我将update@DanielJohnson这能更好地澄清问题吗?确实如此,但丹路德维希正是我所寻求的解决方案。使用中间件,它可以成为所有异常的一揽子解决方案。非常好!非常感谢你。这正是我所需要的。
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";
        }
    }
}