У меня есть проект MVC Web API, над которым я работаю. Я создал контроллер с действием. Я могу правильно выполнить действие, используя Postman
, но когда внешняя система пытается добраться до моего контроллера, он получает ошибку 500. Владелец внешней службы не может предоставить мне какие-либо подробности, кроме того, они могут только повторить запрос.Как лучше устранить эту ошибку 500 в веб-API MVC
Вот одна из записей журнала их запросов в IIS журнала
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status time-taken
2017-02-15 20:38:58 192.168.2.34 POST /Route/to/actionName 8002 - 192.168.2.37 Apache-HttpClient/4.5.2+(Java/1.8.0_102) - 500 0 0 146
Сначала я думал, что может быть действием удара, поэтому я добавил обработчик исключений и добавил регистрацию.
[Route("actionName")]
[HttpPost]
public IHttpActionResult actionName(MessageModel message)
{
try
{
// code to handle the action
}
catch (Exception e)
{
// Code to log exception in the log file
}
}
Пробовал выше и ничего не видел в журнале, я запускать тесты для неудачных запросов, чтобы убедиться, что вышеуказанные журналы обработчика исключений, и это делает.
Итак, следующее, что я решил сделать, это обработать ошибки уровня приложения в Global.asax и исключение журнала там.
protected void Application_Error(object sender, EventArgs e)
{
if (Request.HttpMethod == "POST")
{
var request = SomeMethodToReadRequestContentsInString();
var service = new SomeExceptionLoggingService();
var exception = Server.GetLastError();
if (exception == null)
{
exception = new ApplicationException("Unknown error occurred");
}
service.LogException(exception, Request.UserHostAddress, Request.UserAgent, request);
}
}
И к моему удивлению, ничего в файле журнала.
Итак, я решил зарегистрировать ВСЕ ПОСЛЕДНИЕ ВОПРОСЫ и посмотреть, не регистрирую ли я НИКОГДА в журнале.
protected void Application_EndRequest(object sender, EventArgs e)
{
if (Request.HttpMethod == "POST")
{
var request = Helper.ReadStreamUnknownEncoding(Request.InputStream);
var service = new InterfaceTestingService();
var exception = Server.GetLastError();
if (exception == null)
{
exception = new ApplicationException("No Error in this request");
}
service.LogException(exception, Request.UserHostAddress, Request.UserAgent, request);
}
}
И снова, ничего!
Как поймать эту ошибку? Моя цель - увидеть Content-Type
и содержимое.
Я попытался добавить Custom Field
в параметры журнала IIS, чтобы включить «Content-Type», но в файлах журналов все еще нет.
Включите отладку на своем сервере, после чего вы получите фактическую ошибку, а не общую страницу ошибок ... просто убедитесь, что вы отключаете ее, так как это огромный риск для безопасности. – BillRuhl
@BillRuhl Вызывающий абонент не может предоставить мне больше информации, кроме возвращаемого кода состояния HTTP (да, это глупо). Более того, я не могу уловить его в глобальных обработчиках asax. – fahadash
Ну, я думаю, они очень много * имеют *, чтобы дать вам больше информации. Понятно, что они могут получить только то, что ваш сервер возвращает как ответ с точки зрения фактической ошибки, но они имеют больше информации, которая может помочь вам устранить неполадки, а именно: URI, метод запроса и тело запроса. Учитывая, что вы регистрируете только POST, и вы не получаете никаких журналов, я предполагаю, что они даже не делают POST. Они также могут вызывать неправильную конечную точку или отправлять неправильный тип данных или данных в неправильном формате. Вам нужна эта информация. –