Как вернуть правильный ответ на ошибку в ASP.NET MVC 3.0 через JSON? - PullRequest
10 голосов
/ 23 июня 2011

Я изо всех сил пытаюсь решить эту проблему.На моем локальном компьютере (Win7 / VS2010 / IIS 7.5) и другой идентичной машине разработчика следующий код возвращает код состояния 500, а текст ответа говорит: «Не удалось найти пользователя с указанным адресом электронной почты».

КогдаЯ развертываю сайт на своем тестовом сервере (Win2008 R2 / IIS7.5), он возвращает правильный код состояния, но тип контента установлен как «text / html», а responseText не содержит сообщения.

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

У меня есть форма, которая настроена с использованием метода AjaxHelper.BeginForm:

@using (Ajax.BeginForm("FindUser", new AjaxOptions {OnSuccess="findComplete", OnFailure="findFailed"}) 
{
    <fieldset>
        @Html.EditorFor(m => m.UserEmail)
        <div class="form-item button search">
            <input type="submit" value="Find"/>
        </div>
        <div id="find-err" class="message error hidden">
            <div class="contents"></div>
        </div>
    </fieldset>
}

С функцией обработки ошибок JavaScript:

function findFailed(result) {
    var error = result.responseText;
    if (error) {
        $('#find-err .contents').text(error).slideDown();
    }
}

Действие контроллера перехватывает любые ошибки и возвращает сообщение:

[HttpPost]
public ActionResult FindUser(FindUserModel model) 
{
    try
    {
        // code to find user

        if (user == null) 
        {
            throw new Exception("Could not locate user with specified email address.");
        }

        if (Request.IsAjaxRequest())
        {
            return Json(new { id = user.Id, name = user.Name }, JsonRequestBehavior.AllowGet);
        }

        model.FoundUser = user;
        return View("Details", model);
    }
    catch (Exception ex)
    {
        if (Request.IsAjaxRequest())
        {
            Response.StatusCode = 500;
            return Json(ex.Message, JsonRequestBehavior.AllowGet);
        }

        ModelState.AddModelError("UserEmail", ex.Message);
        return View(model);
    }
}

Любая помощь будет принята с благодарностью:)

1 Ответ

15 голосов
/ 23 июня 2011

Похоже, что IIS использует ответ и пытается сделать с ним пользовательские сообщения об ошибках.

Попробуйте установить

Response.TrySkipIisCustomErrors = true

в своем улове.

В качестве альтернативы установитеследующее значение конфигурации:

<httpErrors errorMode="Custom" existingResponse="PassThrough"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...