【问题标题】:How to globally handle exceptions in ASP.NET WebApi when exception is raised through JsonNetFormatter通过 Json Formatter 引发异常时如何在 ASP.NET Web Api 中全局处理异常
【发布时间】:2016-08-19 13:03:27
【问题描述】:

我们使用 WebApi2AngularJs 开发 ASP.NET MVC5 应用程序。对于序列化和反序列化,我们使用自定义 JsonNetFormatter 如下:

public class JsonNetFormatter : MediaTypeFormatter
{

    //  other codes for formatting

    public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content, TransportContext transportContext)
    {
        string NameOfSet = "";
        ObjectWrapperWithNameOfSet obj = value as ObjectWrapperWithNameOfSet;
        if (obj != null)
        {
            NameOfSet = obj.NameOfSet;
            value = obj.WrappedObject;
        }

        _jsonSerializerSettings.ContractResolver = new CustomContractResolver(NameOfSet);

        // Create a serializer
        JsonSerializer serializer = JsonSerializer.Create(_jsonSerializerSettings);

        // Create task writing the serialized content
        return Task.Factory.StartNew(() =>
        {
            using (JsonTextWriter jsonTextWriter = new JsonTextWriter(new StreamWriter(writeStream, SupportedEncodings[0])) { CloseOutput = false })
            {
                serializer.Serialize(jsonTextWriter, value);
                jsonTextWriter.Flush();
            }
        });
    }
}

和WebApiConfig如下:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services

        // Web API routes

        config.Formatters.Clear();
        config.Formatters.Insert(0, new JsonNetFormatter());
    }
}

应用程序运行良好。但在某些情况下,我们在反序列化 json 数据时会出错。我的问题是我们如何处理这些错误并发送到客户端?

错误示例:

【问题讨论】:

    标签: c# asp.net json error-handling asp.net-web-api2


    【解决方案1】:

    您可以创建自己的自定义异常处理程序来修改任何错误消息,然后再将其发送给客户端

        public class ErrorHandler : ExceptionHandler
        {
            public override void Handle(ExceptionHandlerContext context)
            {
    
                context.Result = new TextPlainErrorResult()
                {
                    Request = context.ExceptionContext.Request,
                    Content = "Oops! Sorry! Something went wrong." + "Please contact support so we can try to fix it."
                };
            }
    
            private class TextPlainErrorResult : IHttpActionResult
            {
                public HttpRequestMessage Request { get; set; }
    
                public string Content { get; set; }
    
                public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
                {
                    HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.InternalServerError, Content);
                    return Task.FromResult(response);
                }
            }
        }
    

    然后在配置类中注册这个自定义类,如下所示

    config.Services.Replace(typeof(IExceptionHandler), new ErrorHandler());

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-12
      • 2019-02-05
      • 1970-01-01
      • 1970-01-01
      • 2014-11-10
      • 2015-01-02
      • 2012-05-04
      • 2016-12-02
      相关资源
      最近更新 更多