Сомнения, связанные с обработкой ошибок в Ajax-запросах в ASP.net MVC - PullRequest
6 голосов
/ 17 сентября 2011

Я уже несколько дней занимаюсь разработкой веб-приложения на своем локальном компьютере с использованием Visual Studio 2010. Прошлой ночью я развернул свое приложение на IIS 7 и разочарованно наткнулся на главный ограничитель шоу.Проблема связана с обработкой ошибок в Ajax-запросе.Для начала у меня есть несколько экранов редактирования, которые работают по запросу ajax.Вот как выглядит ajax-часть экрана редактирования Ajax.

@using (Ajax.BeginForm("_CityEdit", null, new AjaxOptions { HttpMethod = "Post", UpdateTargetId = "content", 
                                                            LoadingElementId="imgSaveLoading", OnFailure="onError",
                                                            OnSuccess = "onSuccess" }, new { id = "frmCity" })) {
    <img id="imgSaveLoading" alt="loading" src="@Url.Content("~/Content/Telerik/Vista/loading.gif")" class="ajax-loader-user" />
    <div class="content" id="content">
        @{Html.RenderPartial("_CityEdit");}   
    </div>

    <!-- Some Other code here -->
}

Я полагался на обратный вызов onError вышеупомянутого Ajax.BeginForm ().Поэтому в моем контроллере всякий раз, когда я хотел отобразить ошибку для пользователя (ошибка модели или любую другую ошибку), я просто устанавливал отклик сервера на 500 (Внутренняя ошибка сервера), оптимистично надеясь, что это приведет к обработчику «OnError» Ajax.BeginForm() вызывается.Вот фрагмент того, как я это сделал в своем контроллере.

[HttpPost]
public ActionResult _CityEdit(CityViewModel viewModel) {
    city = cityManager.FindCity(viewModel.City.Id, false);
    // Validate Model here 
    if (!TryUpdateModel(city, "City")) {
        Response.StatusCode = 500;
        return PartialView("_CityEdit", viewModel);
    }

Как видно из приведенного выше кода, я вернул PartialView и, если он содержал ошибки модели, они автоматически отобразятся на экране редактирования Ajax.,Затем в JavaScript «OnError» я просто заменяю связанный div на PartialView, возвращаемый контроллером, примерно так:

function onError(xhr) {
    $('#content').html(xhr.responseText);
}

Все это прекрасно работает на моей машине для разработки.Когда я развернул свое приложение на IIS 7 и получил доступ к нему из окна Windows XP (с IE 8 или Chrome) вместо PartialView, браузеры просто отобразили экран «500 Internal Server Error» по умолчанию.Поэтому у меня есть несколько сомнений, из-за которых я не спал прошлой ночью.

  1. Является ли подход, который я использовал для редактирования Ajax, разумным.Если бы не то, что могло бы быть другим способом, я мог бы обработать Ajax Editing (с возможностью отображения ошибок модели).

  2. Так как я разрабатывал эти модули уже несколько дней иприложить значительные усилия, есть ли обходные пути, чтобы заставить его работать на XP box.По сути, было бы идеально, если бы я мог как-то запретить браузеру отображать экран по умолчанию «500 Internal Server Error».

  3. Этот подход работает в Windows 7, потому что у меня установлен IIS 7на той же машине с Windows 7, которую я использую для просмотра сайта, или просто она хорошо работает с Windows 7.

Если есть какие-либо другие предложения, пожалуйста, продолжайте.

Редактировать: я нашел обходной путь для моей проблемы.Таким образом, это означает, что сомнения № 2 и 3 даны ответы.По сути, следующая запись в web.config запрещает браузеру отображать страницы браузера по умолчанию для веб-сайта.

  <system.webServer>
      <httpErrors errorMode="Detailed"/>
  </system.webServer>

Но это все же оставляет мои первые сомнения.Использовал ли я разумный подход к редактированию Ajax?


Я проверил ответ с помощью фиддлера, и именно IIS отправлял страницу ошибки по умолчанию для ошибки 500 сервера. Поэтому его необходимо настроить для возврата"Подробный ответ.Мы можем сделать это с помощью диспетчера IIS.Другой вариант, за которым я следовал, - определить его на уровне приложения в файле web.config приложения.

Однако у меня опять возникает дилемма: идти ли с этим подходом или переделывать всю мою заявку.Проблема, которая возникает, заключается в том, что если действительно происходит сбой какого-либо модуля с 500 Internal Server, мой код отображается в браузере, поскольку для errorMode установлено значение «Подробно».Поэтому мне нужен какой-то способ предоставить свой собственный ответ, когда я устанавливаю код ошибки ответа на 500, и если какая-либо другая часть приложения выходит из строя (я не настраиваю 500 кодов состояния), то должна быть отправлена ​​страница ошибки по умолчанию вместо того, чтобы выставлять мой кодчерез «Детальный» ответ.Любая помощь, пожалуйста.

С уважением, NIrvan.

1 Ответ

0 голосов
/ 29 июля 2013

Новое в IIS 7: необходимо установить для HttpResponse.TrySkipIisCustomErrors значение true, чтобы переопределить настройки страниц ошибок IIS, если для customErrors вашего web.config задано значение on (или remoteOnly, и вы работаете удаленно). См. этот ответ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...