2013-08-13 2 views
0

Я боролся с этим в течение двух дней. Это так обескураживает.ApiController принимает json в POST на сервере тестирования localhost, но не на производственном сервере. Зачем?

Это относительно простой контроллер апи:

[HttpPost] 
public HttpResponseMessage Save(ReportCreateInputModel model) 
{ 
    if (ModelState.IsValid) 
    {     
     _service.AddReport(model); 

     HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, model); 
     return response; 
    } 
    else 
    { 
     return Request.CreateResponse(HttpStatusCode.BadRequest); 
    } 
} 

Все отлично работает при отладке на локальном хосте: хххх. Модель действительна, и новая запись может быть вставлена ​​в базу данных.

Но когда он публикуется на сервере, я всегда получаю 400: Bad Request. Я пробовал использовать другой браузер, и я уверен, что это проблема на стороне сервера.

Тогда я попытался увеличить размер запроса, как указано в некоторых других сообщениях. Но он все еще не может работать. Я не смог установить удаленный отладочный инструмент на этом сервере.

Кто-нибудь видел эту проблему раньше? Это что-то с IIS 6?

Я очень ценю любую помощь. Спасибо!


Update:

Оказывается действие апи POST никогда не ударил, прежде чем выбрасывается ошибка Bad Request. Но почему это нормально в локальной отладке?


Update:

Я добавил эти строки кода в WebApiConfig.cs

var json = config.Formatters.JsonFormatter; 
json.SerializerSettings.PreserveReferencesHandling = 
    Newtonsoft.Json.PreserveReferencesHandling.Objects; 
json.SerializerSettings.ReferenceLoopHandling = 
    Newtonsoft.Json.ReferenceLoopHandling.Ignore; 
config.Formatters.Remove(config.Formatters.XmlFormatter); 

config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; 

Сейчас в jqXHR.responseText У меня есть исключение

"$id":"3","Message":"An error has occurred.", 
"ExceptionMessage":"This operation requires IIS integrated pipeline mode.", 
"ExceptionType":"System.PlatformNotSupportedException", 
"StackTrace":" at System.Web.HttpContext.get_CurrentNotification() 
       at System.Web.HttpContextWrapper.get_CurrentNotification() 
       at GetCurrentNotification(Object) 
       at Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(Object target)" 

Wow! Является ли это чем-то связанным с IIS 6? Кто может сказать мне, что такое StackTrace? Благодарю.


Теперь я узнаю в here, что это get_CurrentNotification, что требует трубопровода вещь, которая существует только в IIS7. Но кто может сообщить нам, где я звонил по телефону HttpContext.CurrentNotification?

ответ

0

Попробуйте изменить код, чтобы это вместо того, чтобы понять, почему вы получаете плохой запрос,

return Request.CreateResponse(HttpStatusCode.BadRequest, ModelState); 

Вы всегда должны включать ModelState в своем ответе, если вы возвращаете 400 из-за недопустимого ModelState. Таким образом, у клиентов будет информация о том, что не так с их запросом.

Кроме того, если возможно, только для отладки, включите IncludeExceptionDetails всегда, выполнив это в своей конфигурации. Таким образом, вы можете получить более подробную информацию в своем ответе об ошибке 400.

config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; 

Помните, что вы должны IncludeExceptionDetails всегда только для отладки на рабочих серверах. В противном случае вы будете утечка конфиденциальной информации для всех, кто может получить доступ к вашему сервису, что плохо.

+0

Спасибо за помощь. Но где место для 'config.IncludeErrorDetailPolicy'. В Global.asax? – Blaise

+0

На самом деле я обнаружил, что действие POST никогда не попадалось. Почему пост может достигнуть действия в localhost: xxx, но не на производственном сервере? – Blaise

+0

есть. вы можете настроить IncludeErrorDetailPolicy в свой global.asax или может быть в 'App_Start \ WebApiConfig.cs' –