Подтвердить что ты не робот

Сообщение об ошибке HTTPError не отображается, когда webapi запускается на сервере, а не выполняется локально

У меня есть webapi, который работает на сервере IIS7.5. Он имеет 3 контроллера, и все 3 могут использоваться для доступа к webapi из вызовов внутри моего приложения.

У меня была ошибка, когда мой базовый класс для моего контроллера показывал, что он функционирует как открытый, а не защищенный. Это заставило сервер сбросить внутреннюю ошибку сервера 500 (из-за недействительного исключения, вызванного "Было найдено несколько действий, соответствующих запросу" ). Мне потребовалось некоторое время, чтобы развернуть это, потому что это никогда не приводило к регистрации на моем веб-сайте. Из этого описания здесь я обнаружил, что произошла ошибка, прежде чем функция Application_Error поймает ее для ее регистрации. Поэтому я добавил приведенный ниже код к моему global.asax моего webapi, и теперь я могу регистрировать ошибки, подобные этому.

НО, теперь моя проблема, когда я вызываю Internal Server Error 500 точно так же, как и выше, на моей локальной машине, на которой запущен мой webapi, я получаю журнал точно, как я хочу видеть его с помощью "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);
    }
}

Пример журнала сервера:

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
4b9b3361

Ответ 1

Я обнаружил, что они должны быть включены в GlobalConfiguration для самого webapi:

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

На самом деле сервер определяет, сколько деталей будет отображаться, по умолчанию используется LocalOnly.

Наш метод ведения журнала не считается локальным, я думаю, потому что он фактически не встроен в сам API, а потому, что он находится в общей DLL между несколькими API-интерфейсами.

Я нашел статью this, чтобы быть очень полезной.

Ответ 2

Я использовал этот:

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy
          = IncludeErrorDetailPolicy.Always; 

в глобальном API и это успешно.