WebAPI中HttpResponseException返回JSON

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xxdddail/article/details/79985046

在WebApi的开发中,通常会Global.asax中使用config.Filters.Add(new GlobalExceptionAttribute())来注册一个全局的异常GlobalExceptionAttribute来处理异常,比如UnauthorizedAccessException,ValidationException等,但这些异常只是直接抛回了html的页,在WebAPI的请求中处理并不是太友好,如果能够返回json,那么处理起来会比较方便。比如返回的json和正常数据的json结构是一致的,至少status和message这两个字段都有,那么通过status的判断就可以知道是否异常了。

在GlobalExceptionAttribute的类中重载 OnException方法,然后在内部进行过滤,比如未授权异常。

HttpResponseException(context.Request.CreateResponse(HttpStatusCode.Unauthorized, new ServiceStatus()
                {
                    Status = (int)HttpStatusCode.Unauthorized,
                    Message = "UnAuthorized",
                    ReasonPhrase = "UnAuthorized Access." + context.Exception.Message
                })); 

其中ServiceStatus是自定义的一个类

/// <summary>
    /// 服务状态
    /// </summary>
    [Serializable]
    [DataContract]
    public class ServiceStatus
    {
        #region 属性
        /// <summary>
        /// 状态码
        /// </summary>
        [DataMember]
        public int Status { get; set; }

        /// <summary>
        ///状态信息
        /// </summary>
        [DataMember]
        public string Message { get; set; }

        /// <summary>
        /// 原因
        /// </summary>
        [DataMember]
        public string ReasonPhrase { get; set; }

        #endregion
    }

我们期望返回的json结构也是包含这几个字段的,但是并没有返回。而且诡异的是,本地VS调试是可以的,一到服务器上就不可行了,于是满网络的搜索。

搜出了很多问题和答案,其本上都是说要设置MediaTypeFormatter和MediaType,按网上所说的,将MediaTypeFormatter设置成了jsonFormatter,MediaType也设置成了application/json,即代码如下

 HttpResponseException(context.Request.CreateResponse(HttpStatusCode.Unauthorized, new ServiceStatus()
                {
                    Status = (int)HttpStatusCode.Unauthorized,
                    Message = "UnAuthorized",
                    ReasonPhrase = "UnAuthorized Access." + context.Exception.Message
                },jsonFormatter,"application/json")); 

经过这样的处理后返回的依然是html,这是怎么回事?

思索良久,决定用本地的IIS试试看,结果发现返回的是json结构,那就更奇怪了,本地IIS可以,服务器的IIS不可以。这只有一种可能了,就是本地的IIS和服务器的IIS设置不一致。

经查,发现服务器的IIS对应服务的应用程序池,设置成了【经典】和【启用32位应用程序】设为true,于是果断的将【经典】改为【集成】,【启用32位应用程序】设置为false,终于正常返回为json了。再经过进一步测试发现只要设置【集成】模式,【启用32位应用程序】为true为false都可以。

猜你喜欢

转载自blog.csdn.net/xxdddail/article/details/79985046