【问题标题】:How to return correct response on error in ASP.NET MVC 3.0 via JSON?如何通过 JSON 对 ASP.NET MVC 3.0 中的错误返回正确响应?
【发布时间】:2011-06-23 15:06:22
【问题描述】:

我正在努力解决这个问题。在我的本地机器(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);
    }
}

任何帮助将不胜感激:)

【问题讨论】:

    标签: json asp.net-mvc-3 jquery error-handling


    【解决方案1】:

    看起来 IIS 正在吃掉响应并试图用它来处理自定义错误。

    尝试设置

    Response.TrySkipIisCustomErrors = true
    

    在你的捕获中。

    或者设置以下配置值:

    <httpErrors errorMode="Custom" existingResponse="PassThrough"/>
    

    【讨论】:

    • 不错,没有考虑到 IIS 自定义错误会妨碍您。我的 HandleErrorsAttribute 设置了 TrySkipCustomErrors,但是当直接返回带有 JSON 响应的状态时,我没有设置它。
    猜你喜欢
    • 2014-12-18
    • 2018-07-02
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多