Сообщение об исключении HTTPError не отображается, когда webapi запущен на сервере, а не локально
У меня есть webapi, который работает на сервере IIS7.5. Он имеет 3 контроллера, и все 3 могут быть использованы для доступа к вебапи из звонков в моем приложении.
У меня была ошибка, когда мой базовый класс для моего контроллера выставлял его функции как публичные, а не защищенные. Это привело к тому, что сервер выдал внутреннюю ошибку 500 сервера (из-за недопустимого исключения «найдено несколько действий, соответствующих запросу»). Мне потребовалось некоторое время, чтобы углубиться в это, потому что это никогда не вызывало регистрацию в моем webapi. Из этого предположенияВотЯ обнаружил, что ошибка происходила до того, как функция Application_Error перехватит ее для регистрации. Поэтому я добавил приведенный ниже код в свой global.asax моего webapi и теперь могу регистрировать ошибки, подобные этой.
НО, моя проблема сейчас, когда я вызываю Внутреннюю ошибку сервера 500 точно так же, как описано выше, на моей локальной машине, на которой запущен мой webapi, я получаю журнал именно так, как я хочу его видеть, с помощью «ExceptionMessage» из «Было найдено несколько действий, которые соответствуют запрос "прописан как причина внутренней ошибки сервера. Но при развертывании этого точного кода на сервере и использовании веб-интерфейса оттуда мой журнал отображает только «Сообщение»: «Произошла ошибка» и не отображает «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