2017-02-16 43 views
0

У меня есть проект 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», но в файлах журналов все еще нет.

enter image description here

+0

Включите отладку на своем сервере, после чего вы получите фактическую ошибку, а не общую страницу ошибок ... просто убедитесь, что вы отключаете ее, так как это огромный риск для безопасности. – BillRuhl

+0

@BillRuhl Вызывающий абонент не может предоставить мне больше информации, кроме возвращаемого кода состояния HTTP (да, это глупо). Более того, я не могу уловить его в глобальных обработчиках asax. – fahadash

+0

Ну, я думаю, они очень много * имеют *, чтобы дать вам больше информации. Понятно, что они могут получить только то, что ваш сервер возвращает как ответ с точки зрения фактической ошибки, но они имеют больше информации, которая может помочь вам устранить неполадки, а именно: URI, метод запроса и тело запроса. Учитывая, что вы регистрируете только POST, и вы не получаете никаких журналов, я предполагаю, что они даже не делают POST. Они также могут вызывать неправильную конечную точку или отправлять неправильный тип данных или данных в неправильном формате. Вам нужна эта информация. –

ответ

0

Я добавил обработчик Application_BeginRequest регистрации все, что я сделал в Application_EndRequest. И, оказывается, длина контента была равна нулю, и контент не содержался. Я также перезапустил веб-сервер IIS, чтобы он также мог регистрировать настраиваемые поля.

Странно, что если я отправлю пустой контент через Postman, я получаю код действия, но по какой-то причине, когда он это делает, это не так.