0

そのため、jQuery を使用して SharePoint の Rest Services (つまり、listdata.svc) とやり取りしています。listdata.svc を呼び出して既存のアイテムを更新すると、更新は正常に機能しますが、listdata.svc がアイテムに対して送り返した新しい ETag を取得できません。応答で返される HTTP ステータスは 204 (コンテンツなし) です。新しい ETag は、応答の「ETag」ヘッダーで送信されます (Fiddler ではっきりと確認できます)。しかし、jQuery Ajax 呼び出しの "success:" または "complete:" コールバックで、jqXHR.getResponseHeader("ETag") を呼び出すと、常に null が返されます。Ii が要求するヘッダーに対して null を返します。jqXHR.getAllResponseHeaders() を呼び出すと、空の文字列が返されます。

レコードを追加するときにも同じ問題があります。レコードを追加した後、listdata.svc は ETag と新しいアイテムの URL をリクエスト ヘッダーに送り返しますが、これを取得することはできません!

jQuery-1.7.2、Internet Explorer バージョン 8.0.7601.17514、SharePoint 2010 SP1 を使用しています。クライアント OS は Windows 7 です。

resttest という名前の新しい TeamSite のタスク リストでタスクのタイトルを更新しようとする単純なスクリプトで問題を再現しました。コードを以下に示します。

この問題の修正または回避策を知っている人はいますか? ネイティブ XMLHttpRequest で同じ結果が得られるかどうかをテストしましたが、それも失敗しました。1223 の HTTP STATUS を取得し、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 に答える