无法使用REST在SharePoint 2013中重命名文件夹

6

使用由SharePoint 2013提供的REST API更改文档库中文件夹名称时,我遇到了问题。以下是我正在使用的代码。

string digest = String.Empty;
using (var response = await connector.HttpClient.PostAsync("_api/contextinfo", null, token)) 
{
    response.EnsureSuccessStatusCode();
    var obj = await response.ReadObject("d");
    digest = obj["GetContextWebInformation"].Value<string>("FormDigestValue");
}

using (var request = new HttpRequestMessage(HttpMethod.Post, String.Format("/_api/Web/GetFolderByServerRelativeUrl('{0}')", operation.Path.FullName))) 
{
    request.Headers.Add("X-HTTP-Method", "MERGE");
    request.Headers.Add("IF-MATCH", "*");
    request.Headers.Add("X-RequestDigest", digest);

    //{ '__metadata': { 'type': 'SP.Folder' }, 'Name': 'New name' }
    dynamic obj = new JObject();
    obj.__metadata = new JObject();
    obj.__metadata.type = "SP.Folder";
    obj.Name = operation.DesiredName;

    request.Content = new ODataJObjectContent(obj);

    using (var response = await connector.HttpClient.SendAsync(request, token)) 
    {
        response.EnsureSuccessStatusCode();
        await response.ReadText();
    }
}

在 Fiddler 中这里是请求:
POST http://2013.blah.com/_api/Web/GetFolderByServerRelativeUrl('/Shared%20Documents/Test') HTTP/1.1
X-HTTP-Method: MERGE
IF-MATCH: *
X-RequestDigest: 0xA7C057B3AECE805B7313909570F64B8EACD7A677014B8EBE7F75CC5A7C081F87973D94E7CC22346964ECAB1FE3C6B326DA3B67DF7A646FE6F47E9B1E686C3985,11 Apr 2013 15:13:05 -0000
Accept: application/json; odata=verbose
Content-Type: application/json; odata=verbose
Host: 2013.skysync.com
Content-Length: 50
Expect: 100-continue

{"__metadata":{"type":"SP.Folder"},"Name":"Test2"}

然后是响应:

HTTP/1.1 204 No Content
Cache-Control: private, max-age=0
Expires: Wed, 27 Mar 2013 15:13:15 GMT
Last-Modified: Thu, 11 Apr 2013 15:13:15 GMT
Server: Microsoft-IIS/8.0
X-SharePointHealthScore: 0
SPClientServiceRequestDuration: 15
X-AspNet-Version: 4.0.30319
SPRequestGuid: 53bd109c-43bb-2064-4a1b-82298b670ece
request-id: 53bd109c-43bb-2064-4a1b-82298b670ece
X-RequestDigest: 0x9CDB4F31CC5F3877C4383657C12BEC6CFF10FC28AB6A0BB2D9D38B4279187CBD1450359BDFF07F0E63FF550BFF96C46E0476FB895CDA104348AC066D86246BC6,11 Apr 2013 15:13:15 -0000
X-FRAME-OPTIONS: SAMEORIGIN
X-Powered-By: ASP.NET
MicrosoftSharePointTeamServices: 15.0.0.4420
X-Content-Type-Options: nosniff
X-MS-InvokeApp: 1; RequireReadOnly
Date: Thu, 11 Apr 2013 15:13:15 GMT

当我返回到SharePoint时,测试文件夹仍然是同一个名称,一切看起来都很好。我正在遵循这里的指导方针,并且我已经看到其他非常相似的示例。我可以通过界面轻松重命名它。

提前感谢您的任何帮助!


1
@Jordan 我可以删除文件夹,但我知道这是可能的,但如果这是权限问题,我认为我也无法删除任何内容。 - TroyC
你解决过这个问题吗?我遇到了完全相同的行为,然后网络上的所有内容都说我需要从http 204响应中获取ETag,但是根本没有ETag!如果我使用/ListItemAllFields中的ETag,那对我来说毫无用处... - zaitsman
@zaitsman 不,最终我还是回到了 ASMX 服务来让它正常工作。非常令人沮丧。 - TroyC
2
@TroyC,我认为微软在某个地方宣布他们将在下一个版本中彻底弃用asmx服务。希望在那之前他们能够正确地使用REST... - zaitsman
很遗憾,没有。我不得不使用临时措施来修补他们整个REST API,以便回退到SCOM或ASMX调用。实际上非常糟糕。 - TroyC
显示剩余3条评论
2个回答

1
以下示例演示如何通过SharePoint 2013 REST服务重命名文件夹。
情景:将位于“文档”库中的“存档”文件夹重命名为“2015”。
using (var client = new SPHttpClient(webUri, userName, password))
{
    RenameFolder(client, webUri.ToString(),"Documents/Archive","2015");
}

where

    private static void RenameFolder(SPHttpClient client, string webUrl,string folderUrl,string folderName)
    {
        var folderItemUrl = webUrl + "/_api/web/GetFolderByServerRelativeUrl('" + folderUrl + "')/ListItemAllFields";
        var data = client.ExecuteJson(folderItemUrl);

        var itemPayload = new {
            __metadata = new { type = data["d"]["__metadata"]["type"] },
            Title = folderName,
            FileLeafRef = folderName,

        };
        var  itemUrl = data["d"]["__metadata"]["uri"];
        var headers = new Dictionary<string, string>();
        headers["IF-MATCH"] = "*";
        headers["X-HTTP-Method"] = "MERGE";
        client.ExecuteJson((string)itemUrl, HttpMethod.Post, headers, itemPayload);
    }

注意:
  • SPHttpClient类 - 继承自HttpClient,提供一些特定于SharePoint的功能,例如获取请求摘要
  • SPHttpClientHandler类 - 隐藏了与SharePoint Online身份验证相关的所有复杂性

0

尝试在您的清单文件中添加列表。 这似乎是一个权限问题,当您必须“信任”应用程序时,请选择要操作的列表。


1
非常错误 - 这可能会在任何一侧调用,包括客户端(这是我的情况)。语言可以是任何东西,甚至可能没有“清单”。就权限而言,作者确认他可以删除文件夹,我也是一样 - 我只能使用此API重命名。 - zaitsman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接