首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Web错误处理返回json

问Web错误处理返回json
EN

Stack Overflow用户
提问于 2016-05-23 08:23:26
回答 1查看 454关注 0票数 1

我有一个Web,其中有许多函数以JSON的形式返回对象,例如:

代码语言:javascript
复制
[HttpGet]
public userDTO User(int id)
{
    return dal.GetUser(id);
}

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
            config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
        }
    }

如何实现错误处理?如果发生错误,我想返回一个JSON,只需说{“错误”:“出了问题”}

现在,如果有东西崩溃,API只返回500个错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-23 12:03:30

您最好的选择是实现自定义ExceptionHandler。

代码语言:javascript
复制
public class MyCustomExceptionHandler : ExceptionHandler
{
    private readonly HttpConfiguration _configuration;

    public MyCustomExceptionHandler(HttpConfiguration config){
        _configuration = config;
    }

    public override void Handle(ExceptionHandlerContext context)
    {
        var formatters = _configuration.Formatters;
        var negotiator = _configuration.Services.GetContentNegotiator();

        context.Result = new NegotiatedContentResult<ErrorResponse>(HttpStatusCode.InternalServerError, new ErrorResponse
            {
                Message = context.Exception.Message,
                CustomProperty = "Something"
            }, negotiator, context.Request, formatters);
    }

    public override bool ShouldHandle(ExceptionHandlerContext context)
    {
        return true; //your logic if you want only certain exception to be handled
    }
}

internal class ErrorResponse
{
    public string Message { get; set; }

    public string CustomProperty { get; set; }
}

并在您的WebApiConfig.cs文件中注册它:

代码语言:javascript
复制
public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Services.Replace(typeof (IExceptionHandler), new MyCustomExceptionHandler(config));
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
        config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
    }
}

这样,在出现未处理异常的情况下,可以对返回的错误消息进行分级定制。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37386040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档