Asp.net в MVC - jQuery с $.ajax ошибка обратного вызова не возвращает responseJSON

У меня есть код ниже, с отлично работает на машине разработки, но не при вызове из удаленного браузера...

$.ajax({
  type: 'POST',
  url: '@Url.Action("Action", "Controller")',
  data: { id: id },
  dataType: 'json',
  async: true,
  success: function (data) {
  },
  error: function (jqXHR, status, err) {
    var result = jqXHR.responseJSON;
  }
});

в jqXHR.объект responseJSON работает при вызове из localhost, но не при вызове с удаленного компьютера, он возвращается как неопределенный... Кто-нибудь может мне помочь? Заранее спасибо!

enter image description here

2 ответов


у меня была такая же проблема. При тестировании на моей локальной машине с помощью localhost заполняется ResponseJSON. Когда я загружаю свой проект на тестовый сервер и тестирую, мой responseJSON не определен, и responseTEXT просто дает statusdescription, который я отправил:
(это JSONResult, но я сделал это как ActionResult)

Response.StatusCode = 400;
Response.StatusDescription = "Bad Request - Model State is Invalid";
return Json(new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(ModelState.Values.SelectMany(v => v.Errors)), JsonRequestBehavior.AllowGet);

и для ActionResult специально я также попробовал:

return new HttpStatusCodeResult(400, new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(ModelState.Values.SelectMany(v => v.Errors)));

что дало мне кучу ошибки.

я попробовал с JsonResult следующий код, который работал локально (но у меня была синтаксическая ошибка в JSON), но не работал на тестовом сервере.

return Json(new { success = false, responseJSON = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(ModelState.Values.SelectMany(v => v.Errors)) }, JsonRequestBehavior.AllowGet);

это недавний тест (выше), когда я использовал запрос AJAX для отправки модели формы контроллеру MVC. Я читал, что это потому, что он идет через домен, но это не имеет смысла.

Я создал контроллер веб-API и поместил туда информацию о методе. Это потому, что я хотел использовать HttpReponseMessage и я подумал, что это тип WebAPI. После того, как модель и json и все, чтобы работать вместе, я протестировал и угадайте, что?

когда я использую HttpResponseMessage в качестве возвращаемого типа в WebAPI и возвращаю так:

return Request.CreateResponse(HttpStatusCode.BadRequest, new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(ModelState.Values.SelectMany(v => v.Errors)));

responseJSON и responseText оба заполняются правильно.

Я не знаю, почему это не работает иначе, и если у кого-то есть ответ на это, пожалуйста, сообщите нам.

мне это обойти потому что я чувствую, что это должно было сработать первым способом.

обновление: Использование исходного кода с контроллером MVC-и добавление

Response.TrySkipIisCustomErrors = true;

заставил responseJSON появиться.


как предположил туманный,Response.TrySkipIisCustomErrors = true; Кажется, это правильный путь.

к сожалению, большую часть времени IIS проигнорирует это свойство и пропустит его (возможно, поэтому разработчики называют его Try...).

однако я исправил проблему, добавив Это на Web.config:

<system.webServer>
  <httpErrors existingResponse="PassThrough" />
</system.webServer>

который чище и не "грязный" часть кода.

надеюсь, что это помогает.