0

所以我使用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

    }
}
4

1 回答 1

1

我找到了解决这个问题的可行方法。由于我们无法获取原始 PUT 请求返回的 http 标头,因此我刚刚从原始“PUT”请求的成功回调中向资源发出了一个新查询

>

 _spBodyOnLoadFunctionNames.push("doit");
function doit(){
debugger;
$.ajax({
      url: "http://sgm1dsps06/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/"3"');  // 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
           },
      success: function (data, textStatus, jqXHR) {
            },
      complete: function (jqXHR, textStatus) {
               debugger;
                if (jqXHR.status === 204) {
                    // requery the resource to get the new etag // this is due to a bug in ie that drops all headers associated with an http 204
                    $.ajax({
                        async: false,
                        contentType: 'application/json; charset=utf-8',
                        datatype: 'json',
                        url: this.url,
                        success: function (data, textStatus, jqXHR) {
                            var etag = jqXHR.getResponseHeader("ETag");
                            alert(etag);
                        }
                    }
                  }
            },
      error: function (jqXHR, textStatus, errorThrown) {
                debugger;
                alert(jqXHR.responseText);
                                }
    });
}
于 2012-06-11T17:59:25.480 回答