所以我使用jQuery 与SharePoint 的Rest Services(即listdata.svc)进行交互。当我调用 listdata.svc 更新现有项目时更新工作正常,但我无法获取 listdata.svc 为该项目发回的新 ETag。在响应中返回的 HTTP 状态是 204(无内容)。新的 ETag 在响应中的“ETag”标头中发送(我可以在 Fiddler 中清楚地看到它)。但是在我的 jQuery Ajax 调用的“成功:”或“完成:”回调中,如果我调用 jqXHR.getResponseHeader("ETag") 它总是返回 null。对于 Ii 要求的任何标头,它都返回 null。如果我调用 jqXHR.getAllResponseHeaders() 它返回一个空字符串。
添加记录时,我遇到了同样的问题。添加记录后,listdata.svc 会发回 ETag,以及请求标头中的新项目的 URL,我无法获取!
我正在使用 jQuery-1.7.2、Internet Explorer 版本 8.0.7601.17514 和带有 SP1 的 SharePoint 2010。客户端操作系统是 windows 7。
我在一个简单的脚本中重新创建了该问题,该脚本尝试更新名为 resttest 的新 TeamSite 的任务列表中的任务标题。代码如下所示。
有谁知道这个问题的修复或解决方法?我测试了我是否得到与本机 XMLHttpRequest 相同的结果,但这也失败了。我得到一个 1223 的 HTTP 状态,并且 client.getResponseHeader("ETag") 返回一个空字符串。本机代码如下所示。
我在 IE9 中测试了 tis,我得到了同样糟糕的结果。我在 Chome 和 Firefox(使用 XMLHttpRequest 版本)中测试了 int 并且 client.getResponseHeader("ETag") 重新调整了 ETAG!在两个浏览器中!(太糟糕了,我的 yCOmpany 标准是 IE!)。
这是使用 jQuery 的代码:
_spBodyOnLoadFunctionNames.push("doit");
function doit(){
debugger;
$.ajax({
url: "http://myServerName/resttest/_vti_bin/listData.svc/Tasks(1)",
contentType: 'application/json; charset=utf-8',
datatype: 'json',
type: 'POST',
async: true,
global:false,
processData:false,
data:"{Title:'Updated title'}",
beforeSend: function (jqXHR, settings) {
jqXHR.setRequestHeader("X-HTTP-Method", "PUT");
jqXHR.setRequestHeader("If-Match", 'W/"2"'); // this must be set to the "Current" value of the etag on the server (I can get to it by calling http://myServerName/resttest/_vti_bin/listData.svc/Tasks(1)) from a browser
},
success: function (data, textStatus, jqXHR) {
},
complete: function (jqXHR, textStatus) {
debugger;
var x = jqXHR.getResponseHeader("ETag"); // this returns null , even though i see ETag: W/"2" in the headers in fiddler!
var y = this.xhr();
var z = y.getAllResponseHeaders();
var kjh = y.getResponseHeader("ETag");
},
error: function (jqXHR, textStatus, errorThrown) {
debugger;
alert(jqXHR.responseText);
alert('Something bad happened. Stopping');
}
});
}
以下是 Fiddler 的响应标头:
HTTP/1.1 204 No Content
Cache-Control: no-cache
ETag: W/"2"
Server: Microsoft-IIS/7.5
SPRequestGuid: d0fc56f0-8277-469a-a290-e7d3de96295d
Set-Cookie: WSS_KeepSessionAuthenticated={b6a87457-6e7d-4de0-9c8d-f56add57f6f4}; path=/
X-SharePointHealthScore: 0
DataServiceVersion: 1.0;
X-AspNet-Version: 2.0.50727
Set-Cookie: WSS_KeepSessionAuthenticated={b6a87457-6e7d-4de0-9c8d-f56add57f6f4}; path=/
X-Powered-By: ASP.NET
MicrosoftSharePointTeamServices: 14.0.0.6106
Date: Thu, 07 Jun 2012 18:25:14 GMT
下面是使用 XMLHttpRequest 的代码:
_spBodyOnLoadFunctionNames.push("doit");
function doit() {
debugger;
var url = "http://sgm1dsps06/resttest/_vti_bin/listData.svc/Tasks(1)";
var client = new XMLHttpRequest();
client.open("POST", url, false);
client.setRequestHeader("X-HTTP-Method", "PUT");
client.setRequestHeader("Content-Type", "application/json; charset=utf-8");
client.setRequestHeader("If-Match", 'W/"5"'); // this must be set to the "Current" value of the etag on the server (I can get to it by calling http://sgm1dsps06/resttest/_vti_bin/listData.svc/Tasks(1)) from a browser
client.send("{Title:'Updated title'}");
{
alert("Status is : " + client.status + " " + client.statusText + "."); //the status is always 1223
var etag = client.getResponseHeader("ETag");
if (etag == null)
alert("etag is null");
else
alert("Etag is " + etag); // the etag is alwasys an empty string
}
}