我有一个简单的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”是武断的还是以某种方式决定的?我可以设置属性的名称,无论是客户端还是服务器端?
答案 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)。