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

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

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

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

public class ResponseExceptionTrapper : DelegatingHandler { protected override Task 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); } } 

服务器日志示例:

 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."} 

本地日志示例:

 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 

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

 1: config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.LocalOnly; 2: config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; 3: config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Never; 

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

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

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

我用过这个:

 GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; 

在Global of API中,它取得了成功。