当webapi在服务器上运行而不是在本地运行时,HTTPError异常消息不显示
本文关键字:运行时 HTTPError 异常 显示 消息 服务器 webapi 运行 | 更新日期: 2023-09-27 17:59:51
我有一个运行在IIS7.5服务器上的webapi。它有3个控制器,所有3个控制器都可以用于从我的应用程序中的调用访问webapi。
我有一个错误,我的控制器的基类将它的函数公开为公共函数,而不是受保护的函数。这导致服务器引发内部服务器错误500(因为引发了一个无效异常"找到了与请求匹配的多个操作")。我花了一段时间来深入了解这一点,因为它从未触发我的webapi的日志记录。从这里的讨论中,我发现发生的错误发生在Application_error函数捕获它并记录它之前。因此,我将以下代码添加到我的webapi的global.asax中,现在我可以记录这样的错误了。
但是,我现在的问题是,当我在运行webapi的本地机器上导致与上述完全相同的内部服务器错误500时,我会得到一个日志,其中包含"发现多个与请求匹配的操作"的"ExceptionMessage"作为内部服务器错误的原因。但是,当将这个确切的代码部署到服务器并从那里使用webapi时,我的日志只显示"Message":"An error has occured",而不显示"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);
}
}
服务器日志示例:
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;
API全球它成功了。