12

主题是不言自明的。我有开发人员和生产环境。开发人员环境。是我的本地主机机器。我在控制器中有操作方法,当出现问题(发生错误或逻辑不一致)并返回 Json-answer 时,将响应状态代码设置为 500。我常用的方法是这样的:

[HttpPost]
public ActionResult DoSomething(int id)
{
    try
    {
         // some useful code
    }
    catch(Exception ex)
    {
         Response.StatusCode = 500;
         Json(new { message = "error" }, JsonBehaviour.AllowGet)
    }
}

在生产环境的客户端。当发生此类错误时,ajax.response 看起来像 HTML 代码,而不是预期的 JSON。

考虑一下:

<div class="content-container">
 <fieldset>
   <h2>500 - Internal server error.</h2>
   <h3>There is a problem with the resource you are looking for, and it cannot be displayed.</h3>
</fieldset>
</div>

过滤上下文不是一个选项。我认为这是某种 IIS 或 web.config 问题。

解决方案: 我们决定TrySkipIisCustomErrors在 Global.asax 中添加 BeginRequest,它解决了我们应用程序中每个方法的问题。

4

3 回答 3

13

我猜想 IIS 正在提供一些友好的错误页面。TrySkipIisCustomErrors您可以尝试通过在响应中设置属性来跳过此页面:

catch(Exception ex)
{
     Response.StatusCode = 500;
     Response.TrySkipIisCustomErrors = true;
     return Json(new { message = "error" }, JsonBehaviour.AllowGet)
}
于 2013-05-16T08:42:36.027 回答
0

您的 IIS 是否配置application/json为有效mime-type?您可以在 IIS 管理器中检查服务器的属性,然后单击 MIME 类型。如果 json 不存在,则单击“新建”,为扩展名输入“JSON”,为 MIME 类型输入“application/json”。

于 2013-05-16T08:38:27.033 回答
0

我通过编写自定义 json 结果解决了这个问题,该结果使用 json.net 作为序列化程序。这对于 IIS 修复来说是多余的,但这意味着它是可重用的。

public class JsonNetResult : JsonResult
{
    //public Encoding ContentEncoding { get; set; }
    //public string ContentType { get; set; }
    public object Response { get; set; }
    public HttpStatusCode HttpStatusCode { get; set; }

    public JsonSerializerSettings SerializerSettings { get; set; }
    public Formatting Formatting { get; set; }

    public JsonNetResult(HttpStatusCode httpStatusCode = HttpStatusCode.OK)
    {
        Formatting = Formatting.Indented;
        SerializerSettings = new JsonSerializerSettings { };
        SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
        HttpStatusCode = httpStatusCode;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
            throw new ArgumentNullException("context");

        HttpResponseBase response = context.HttpContext.Response;

        response.TrySkipIisCustomErrors = true;

        response.ContentType = !string.IsNullOrEmpty(ContentType) ? ContentType : "application/json";

        if (ContentEncoding != null)
            response.ContentEncoding = ContentEncoding;

        response.StatusCode = (int) HttpStatusCode;

        if (Response != null)
        {
            JsonTextWriter writer = new JsonTextWriter(response.Output) { Formatting = Formatting };

            JsonSerializer serializer = JsonSerializer.Create(SerializerSettings);
            serializer.Serialize(writer, Response);

            writer.Flush();
        }
    }
}

利用:

            try
            {
                return new JsonNetResult()
                {
                    Response = "response data here"
                };
            }
            catch (Exception ex)
            {
                return new JsonNetResult(HttpStatusCode.InternalServerError)
                {
                    Response = new JsonResponseModel
                    {
                        Messages = new List<string> { ex.Message },
                        Success = false,
                    }
                };
            }
于 2015-04-01T09:37:35.770 回答