ASP.NET WEBAPI中"An error has occurred."的解决方法

momo314相同方式共享非商业用途署名转载

想必大家在最开始接触ASP.NET WEBAPI的时候都遇到过这种奇葩问题吧

访问了一个接口,满心希望的等待着服务器给我们返回需要的数据,结果。。。

{"Message":"An error has occurred."}

或者

<Error>
    <Message>An error has occurred.</Message>
</Error>

( ̄工 ̄lll)

什么鬼!这啥玩!An error has occurred!

给个具体点的错误啊喂!这尼玛“发生了一个错误!”查毛线啊!到底是哪儿发生了错误啊!发生了什么错误啊!!!

不知道大家是什么感觉,反正我第一次见到这个错误的时候是有一种崩溃的感觉的,这尼玛什么也没说啊!

别急,其实我们只需要一句代码就可以让他显示出具体的错误信息和调用堆栈了,那么,跟我来!


首先,找到 App_Start\WebApiConfig.cs 这个类,这是一个静态类,大家都知道,这个类中有一个Register方法,这个方法会在 Global.Application_Start 中被调用,目的是为了注册路由信息。

//Global.asax
void Application_Start(object sender, EventArgs e)
{
    // some other code...
    WebApiConfig.Register(GlobalConfiguration.Configuration);
}

//WebApiConfig.cs
public static void Register(HttpConfiguration config)
{
    // regiter routes
}

那么,主角来了,他有一个 HttpConfiguration 类型的参数:config。WEBAPI的很多配置信息都是由他来控制的。

比如:config.IncludeErrorDetailPolicy 这是一个枚举类型,没错,从名字也看出来了,他就是用来控制异常信息输出的:

public enum IncludeErrorDetailPolicy
{
    /// <summary>
    /// Use the default behavior for the host environment. For ASP.NET hosting, use
    /// the value from the customErrors element in the Web.config file. For self-hosting,
    /// use the value System.Web.Http.IncludeErrorDetailPolicy.LocalOnly.
    /// </summary>
    Default = 0,

    /// <summary>
    /// Only include error details when responding to a local request.
    /// </summary>
    LocalOnly = 1,

    /// <summary>
    /// Always include error details.
    /// </summary>
    Always = 2,

    /// <summary>
    /// Never include error details.
    /// </summary>
    Never = 3,
}

是不是和web.config中的 customErrors 配置很像?

其实代码注释也已经说的很清楚了:当WEBAPI运行于 IIS托管 的时候,这个配置就是会从 customErrors 节点来获取;但是,当WEBAPI运行于 自托管 的时候,则使用 LocalOnly

问:我不管怎么托管,怎么运行,反正我就是遇到了这个什么异常信息也没说的报错,那我们就是想看具体的异常信息,怎么办!你说!

答:

那就强制指定咯:IncludeErrorDetailPolicy.Always 不管!就给我输出具体错误信息!

//WebApiConfig.cs
public static void Register(HttpConfiguration config)
{
    // regiter routes

    // 当我打开这个appsetting配置时,强制显示具体异常信息
    if (ConfigurationManager.AppSettings["ShowDetailErrors"] == "1")
        config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
}

OK! 这下我们就可以愉快的排查错误啦 ╮( ̄▽ ̄)╭

✎﹏ 本文来自于 momo314和他们家的猫,文章原创,转载请注明作者并保留原文链接。