当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在服务器上运行而不是在本地运行时,HTTPError异常消息不显示

我发现这些需要在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全球它成功了。