是否有访问JSON.parse XMLHTTPRequest.responseText的通用方法?

时间:2015-04-23 18:36:41

标签: javascript c# asp.net json

我有一个简单的ASP.NET Web应用程序,其中包含以下javascript,它在输入的onblur事件上运行:

function checkUserName() {
    var request = new XMLHttpRequest();
    if (request == null) {
        alert("Unable to create request.");
    } else {
        var theName = document.getElementById("username").value;
        var userName = encodeURIComponent(theName); 
        var url = "Default.aspx/CheckName?name='" + theName + "'";
        request.onreadystatechange = createStateChangeCallback(request);
        request.open("GET", url, true);
        request.setRequestHeader("Content-Type", "application/json");       
        request.send();
    }
}

此调用的C#方法如下:

[WebMethod]
[ScriptMethod(UseHttpGet = true)]
public static string CheckName(string name)
{
   return name + " modified backstage";
}

XMLHttpRequest的javascript回调如下:

function createStateChangeCallback(request) {
    return function () { 
        if (request.readyState == 4) {
            var parsed = JSON.parse(request.responseText);
            alert(parsed.d);           
        }
    }
}

虽然这显示了我的服务器端方法的结果,但我想知道我需要访问的属性“d”才能获得结果。我只是通过使用Intellisense找到了这个。此属性是否是访问已解析JSON的标准属性?我应该采取其他方式吗? “d”是武断的还是以某种方式决定的?我可以设置属性的名称,无论是客户端还是服务器端?

3 个答案:

答案 0 :(得分:1)

关于以下内容:

var parsed = JSON.parse(request.responseText);
alert(parsed.d);  

d是来自服务器通过GET请求发送的响应对象的实际属性。它不是从JSON.parse()方法创建的特殊属性。

服务器可能将返回数据对象包装到d。因此,响应对象看起来像{ d: stuff },其中stuff是返回的数据。

<强> - 编辑 - 经过一番挖掘后,ASP.NET和WCF端点将JSON对象格式化为d属性,以防止CSRF和XSS攻击。有关详细信息,请访问http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx/

答案 1 :(得分:1)

.d由ASP.NET在System.Web.Extensions命名空间下的框架代码中添加,并且它是硬编码的,所以不,不幸的是,您无法对其进行更改。它可以缓解XSS攻击。然而,从好的方面来说,你可以指望始终存在.d

答案 2 :(得分:0)

不。担心标准的xmlhttprequest对象不是为XML / HTML设计的,所以你需要从我害怕的原始文本中解析json。

新的XHR2规范确实处理了其他响应类型(如果您的浏览器支持mimd)。

http://www.html5rocks.com/en/tutorials/file/xhr2/