C# ASP.NET 5 API向调用方返回异常
我正在从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 下面是我用来测试这一点的代码示例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
[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";
}
}
}