У меня есть 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