0

我已经完成了我能想到的所有调试,但找不到任何与正在发生的事情完全匹配的东西。这是代码,总之它是在调试荣耀/愚蠢。

[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)]
public ActionResult ConciergeRead([DataSourceRequest] DataSourceRequest request)
{
    var concierges = GetConcierges();
    var sorted = concierges.ToDataSourceResult(request);
    var json = Json(concierges, "text/x-json");
    string jsonString = new JavaScriptSerializer().Serialize(json.Data);
    var json2 = Json(sorted, "text/x-json");
    return json;
}

ToDataSourceResult位是 Kendo-UI 的一部分,它是 MVC 的 Telerik 扩展,但排除 Kendo-UI 位并不能解决问题。无论我从哪个浏览器调用,无论是 Ajax 请求还是浏览器中的直接 GET,我都无法获得返回非空响应的路由。同样的事情总是会发生:没有响应体。有响应头,但正文有零字节的数据。

这是在本地运行,活动目录登录集成运行顺利(如果我不登录,我会在父路由上被禁止/mvc/123/concierges,如果我直接点击 Ajax 路由)。服务器是通过 Visual Studio 2012 启动的 IIS Express 8.0。

响应标头

HTTP/1.1 200 OK
Cache-Control: private
Server: Microsoft-IIS/8.0
X-AspNetMvc-Version: 3.0
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?QzpcTGVhZE1hc3RlclxMYXRlc3RccGxhdGZvcm1cTGVhZE1hc3RlclBsYXRmb3JtXEF3bC5MZWFkTWFzdGVyLk12Y1wxMjNcY29uY2llcmdlc1xDb25jaWVyZ2VSZWFk?=
Persistent-Auth: true
X-Powered-By: ASP.NET
Date: Fri, 21 Dec 2012 17:19:38 GMT
Content-Length: 0

来自直接浏览器的请求标头获取(这是 chrome,但 FF 是相同的,具有不同的 cookie 和用户代理)

GET /mvc/123/concierges/ConciergeRead HTTP/1.1
Host: localhost:7171
Connection: keep-alive
Cache-Control: max-age=0
Authorization: Negotiate oXcwdaADCgEBoloEWE5UTE1TU1AAAwAAAAAAAABYAAAAAAAAAFgAAAAAAAAAWAAAAAAAAABYAAAAAAAAAFgAAAAAAAAAWAAAABXCiOIGAbEdAAAADxZEeKqgJFuPmHxoeEOwIJWjEgQQAQAAAPUXp1AtIpqEAAAAAA==
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: ASP.NET_SessionId=zctn1diidxyookfgq11rx1uy

来自剑道 UI 发起的 Ajax 请求的请求标头(这个是 FF,但是等等)

GET /mvc/123/concierges/ConciergeRead HTTP/1.1
Host: localhost:7171
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
X-Requested-With: XMLHttpRequest
Referer: http://localhost:7171/mvc/123/Concierges/
Cookie: ASP.NET_SessionId=4ff34okn0jkkwqi3k0qswb4l
Cache-Control: max-age=0

我采取的步骤

  • 调试代码,验证路由是否被正确命中
  • 已验证GetConcierges()返回数据,序列化为 json,序列化为字符串,并且在整个过程中看起来都是正确的
  • 铬、FF 和 IE9
  • 不同的接受动词
  • 返回类型为 JsonResult 而不是 ActionResult

即使您没有解决方案,我们也非常感谢您提供额外的调试步骤。

4

1 回答 1

3

您需要先允许 JSON 结果:

var json2 = Json(sorted, "text/x-json");

作为

return Json(json2, JsonRequestBehavior.AllowGet);

它被禁用以防止 JSON 劫持,所以在发送敏感信息时不要使用这个东西(然后在响应的正文中返回敏感数据)

于 2012-12-21T17:51:03.240 回答