HTTPError异常在服务器上运行webapi与在本地运行时不显示消息

coo*_*tty 29 c# iis-7.5 httpcontent

我有一个在IIS7.5服务器上运行的webapi.它有3个控制器,所有3个控制器都可用于从我的应用程序中的调用访问webapi.

我有一个错误,我的控制器的基类将其功能公开,而不是保护.这导致服务器抛出内部服务器错误500(因为抛出了无效的异常"找到了与请求匹配的多个操作").我花了一段时间来深入研究这个,因为它从未触发过我的webapi的日志记录.从这个dicussion 这里,我发现这是发生错误是发生之前的Application_Error功能会赶上它来记录它.所以我将下面的代码添加到我的webapi的global.asax中,现在我可以记录这样的错误.

但是,我现在的问题是,当我在运行我的webapi的本地机器上导致内部服务器错误500与上面完全相同时,我得到了一个日志,我希望看到它的"ExceptionMessage""找到匹配的多个操作"请求"拼写为内部服务器错误的原因.但是当将这个确切的代码部署到服务器并从那里使用webapi时,我的日志只显示"消息":"发生了错误"并且没有向我显示"ExceptionMessage",即使我可以看到异常是使用PerfView抛出.我只需要能够获取我的服务器日志以显示与本地日志显示的信息相同的信息.

public class ResponseExceptionTrapper : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request,
        CancellationToken cancellationToken)
    {
        return base
            .SendAsync(request, cancellationToken)
            .ContinueWith(response =>
            {
                var result = response.Result;
                if (!result.IsSuccessStatusCode)
                {
                    var exceptionResult = string.Format(
                         "Response exception: \r\n Path({0}) \r\n Status({1}) \r\n",
                         request.RequestUri,
                         result.StatusCode);

                    if (result.Content != null)
                    {
                        var exceptionReadTask =
                               result.Content.ReadAsStringAsync();

                        exceptionReadTask.Wait();
                        exceptionResult += "Message:" +
                                          exceptionReadTask.Result;

                    }

                    // Do something appropriate with exceptionResult
                    exceptionResult.Log();
                }

                return result;
            }, cancellationToken);
    }
}
Run Code Online (Sandbox Code Playgroud)

服务器日志示例:

Timestamp: 4/24/2014 12:24:40 PM
Message: Timestamp: 4/24/2014 4:24:40 PM
Message: Response exception: 
Path(http://webserver/CreditReporting/Api/RetrieveQueuedPullCreditReport) 
Status(InternalServerError) 
Message:{"Message":"An error has occurred."}
Run Code Online (Sandbox Code Playgroud)

本地日志示例:

Timestamp: 4/24/2014 12:03:16 PM
Message: Timestamp: 4/24/2014 4:03:16 PM
Message: Response exception: 
 Path(http://localhost:XXXXX/Api/RetrieveQueuedPullCreditReport) 
 Status(InternalServerError)
 Message:
  {"Message":"An error has occurred.",
  "ExceptionMessage":"Multiple actions were found that match the request:
    \r\nSystem.Threading.Tasks.Task`1[
 Our.WebServices.CreditReporting.Contracts.RetrieveQueuedPullCreditReportResponse] Post
Run Code Online (Sandbox Code Playgroud)

coo*_*tty 59

我发现需要在webapi本身的GlobalConfiguration中打开这些:

1: config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.LocalOnly;
2: config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
3: config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Never;
Run Code Online (Sandbox Code Playgroud)

服务器实际上确定要显示多少细节,默认为LocalOnly.

我们的日志记录方法不被认为是本地的,我想因为它实际上并没有内置到API本身,而是因为它位于多个API之间的共享dll中.

我发现这篇文章非常有帮助.


小智 5

我用过这个:

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy
          = IncludeErrorDetailPolicy.Always; 
Run Code Online (Sandbox Code Playgroud)

在 API 的全局中,它成功了。