C# Web API 2服务-如何返回状态为的异常消息

C# Web API 2服务-如何返回状态为的异常消息,c#,web-services,asp.net-web-api,C#,Web Services,Asp.net Web Api,在WebAPI2中,是否可以在响应状态下直接返回异常消息 例如,如果我正在编写一个WCF服务(而不是Webi API),我可以按照以下步骤直接返回一条异常消息作为响应状态的一部分: 在这里,web服务在响应中不返回任何数据,错误消息直接在状态描述中返回 这正是我希望我的Web API服务在发生异常时所做的,但我不知道如何做 大多数建议使用如下代码,但是错误消息将始终以单独的响应字符串返回,而不是作为状态的一部分 例如,如果我要使用此代码: public IHttpActionResult Ge

在WebAPI2中,是否可以在响应状态下直接返回异常消息

例如,如果我正在编写一个WCF服务(而不是Webi API),我可以按照以下步骤直接返回一条异常消息作为响应状态的一部分:

在这里,web服务在响应中不返回任何数据,错误消息直接在状态描述中返回

这正是我希望我的Web API服务在发生异常时所做的,但我不知道如何做

大多数建议使用如下代码,但是错误消息将始终以单独的响应字符串返回,而不是作为状态的一部分

例如,如果我要使用此代码:

public IHttpActionResult GetAllProducts()
{
    try
    {
        //  Let's get our service to throw an Exception 
        throw new Exception("Something went wrong");

        return Ok(products);
    }
    catch (Exception ex)
    {
        return new System.Web.Http.Results.ResponseMessageResult(
            Request.CreateErrorResponse((HttpStatusCode)500, 
                new HttpError("Something went wrong")));
    }
}
。。。然后它返回一条通用500消息,异常以JSON字符串形式返回

有人知道如何修改Web API函数(返回
IHttpActionResult
对象)来执行此操作吗?


请参考以上链接,它将帮助您

您可以注册一个将处理所有异常的自定义全局筛选器。比如:

public class CatchAllExceptionFilterAttribute : ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext context)
    {
        context.Response = new HttpResponseMessage(HttpStatusCode.InternalServerError)
        {
            Content = new StringContent(context.Exception.Message)
        };
    }
}
您需要在WebApiConfig.cs中注册它,注册地址为:

config.Filters.Add(new CatchAllExceptionFilterAttribute());
每次系统中出现未处理的异常时,都会命中此筛选器,并将http响应设置为异常消息。您还可以检查不同类型的异常,并相应地更改响应,例如:

    public override void OnException(HttpActionExecutedContext context)
    {
        if(context.Exception is NotImplementedException)
        {
            context.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented)
            {
                Content = new StringContent("Method not implemented.")
            };
        }
        else
        {
            context.Response = new HttpResponseMessage(HttpStatusCode.InternalServerError)
            {
                Content = new StringContent(context.Exception.Message)
            };
        }

    }