Сообщение об ошибке 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
Ответы
Ответ 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
и это успешно.