2013-05-01 63 views
6

有些同事和我遇到问题,即来自ajax调用的响应返回一些意外的内容。 result.responseText的值不是使用各种属性返回简单的JSON对象,而是通用的406状态错误页面的HTML标记,表示浏览器不接受MIME类型。406返回JSON对象时出错 - 意外的内容

电话可以拨出像这样:

$.ajax({ 
    url: '/promociones/cincogratis/canjear-codigo-promocional', 
    type: this.method, 
    data: $(this).serialize(), 
    success: function (result) { 
      $('.promotion_banner .loader').hide(); 
      $('.promotion_banner').html(result); 
    }, 
    error: function (result) { 
      var obj = result.responseText; 
      if (obj.isRedirect) { 
        document.location = obj.redirectUrl; 
      } 
      else { 
        $('.promotion_banner .loader').hide(); 
        $(".error-wrapper").removeClass("hidden");       
        var generic_error = document.getElementById('generic_error').value; 
        $(".error-wrapper p").html(generic_error); 
      } 
    }, 
    beforeSend: function() { 
      $('.promotion_banner .loader').show(); 
    } 
}); 

控制器响应政府号召是像这样:

Response.StatusCode = (int)HttpStatusCode.NotAcceptable; // 406 
return Json(new { errorMessage = LocalErrorMessages.Website_Promotions_FreeFiver_General_Problem, isRedirect = false }); 

我们希望result.responseText以包含的errorMessage和isRedirect键值,但他们不在那里。

值得指出的是,这段代码是多租户的,由当前应用程序共享,另一个则完全正常。

我们已经尝试过:
- 配置IIS显示详细的错误响应而不是自定义页面以获取更多详细信息 - 为解决问题提供了额外的帮助。
- 允许所有响应的内容类型的号召
- 改变我们网站的文化(这是目前ES-ES)
- 各种web.config中调整

有没有人有这个问题?

+0

如果服务器不支持客户端发送的各种“Accept”头,则应使用“406”。这是你的错误反应的真正含义吗?我不认为HTTP错误是正确的方法;也许你应该返回一个'200',并且客户端会检查响应以确定它是否是错误的(或者可能有更正确的状态码)。 – Jacob 2013-05-01 18:58:03

+0

根据这个答案,'403'可能是一个更好的选择,也许它会保存你的JSON:http://stackoverflow.com/a/3290369/119549 – Jacob 2013-05-01 19:03:32

+0

感谢Jacob。 HTTP是一种应用程序级别的协议,因此我们使用4xx作为告诉浏览器存在业务错误的方式。不寻常的是,服务器返回的406响应是核心代码库的一部分(我们的每个应用程序在这里都使用相同的代码),并且我们仅遇到其中一个应用程序的这个问题。 – 2013-05-02 09:39:48

回答

0

简化您的请求。可能是这样的:

$.ajax({ 
    url: '/promociones/cincogratis/canjear-codigo-promocional', 
    type: 'GET', 
    data: {foo:'bar', one:'two'}, 
    dataType: 'json', 
    success: function (result) { 
      console.dir(result); 
    }, 
    error: function (xhr) { 
      console.dir(xhr) 
    } 
}); 

并从服务器发布响应。这种错误似乎是一个请求问题,而不是服务器配置问题

+0

我认为这个问题是为什么包含在错误中的JSON没有出现,而不是为什么错误被接收到(它预计会得到一个406) – Jacob 2013-05-01 18:48:11

+0

这就是为什么我在参数中设置dataType:'json'认为jQuery有问题解释头的接受 – 2013-05-01 18:55:48

+0

406错误状态是在OP的代码中明确发送的东西 – Jacob 2013-05-01 18:59:12