Sharepoint REST在文档上载后设置元数据

时间:2014-09-12 09:07:48

标签: c# rest sharepoint

我有一个C#控制台应用程序(当它完成时最终将成为一个Windows服务)。目的是将文档存储(500k +文档)迁移到SharePoint 2013。

请注意,这是一个独立的C#应用​​程序,可以在未安装SharePoint的服务器上运行。我通过HttpClient调用使用纯REST。

上传文档并设置元数据有3个步骤:

  1. 上传文件(POST)

    e.g。 baseURL +“web /”+“GetFolderByServerRelativeUrl('/ sites”+ libPath +“')/ Files / Add(url ='”+ filename +“',overwrite = true)”;

  2. 检索与此文档关联的列表项的详细信息(GET)

    e.g。 baseURL +“web / lists / getbytitle('”+ docLibName +“')/ items?$ filter = Title eq'”+ filenameNoExt +“'”

  3. 前两个步骤正常。

    1. 更新元数据
    2. 这是导致我不眠之夜的一点。我似乎无法弄清楚我应该发送到Web服务的确切内容,而我尝试的任何内容都会产生错误。我找不到任何试图这样做的人的例子;并且MS文档非常稀疏。

      来自http://msdn.microsoft.com/en-us/library/office/dn292552%28v=office.15%29.aspx的MS文档说:

      以下示例显示如何使用MERGE方法更新列表。

      url: http: //siteurl/_api/web/lists(guid'list GUID') method: POST body: { '__metadata': { 'type': 'SP.List' }, 'Title': 'New title' } Headers: Authorization: "Bearer " + accessToken X-RequestDigest: form digest value IF-MATCH": etag or "*" X-HTTP-Method: MERGE, accept: "application/json;odata=verbose" content-type: "application/json;odata=verbose" content-length:length of post body

      在我的应用程序中,我已将查询中的类型设置为SP.Data.CertificatesItem,这是在步骤2中返回的内容;我正在尝试将证书类型字段设置为指定的值,而不是文档标题:

      string body = "{ '__metadata': { 'type': '" + spItemType + "' }, 'CertificateType': 'Medical Certificate'}";

      (有几个字段需要设置;我只是在这里硬编码一个字段用于测试目的。需要设置的字段取决于文档库的内容类型。)

      此外,URL略有不同。例子有:

      http: //siteurl/_api/web/lists(guid'list GUID')

      我有(具体例子,略有匿名):

      http: //siteurl/_api/Web/Lists(guid'cdcbef76-8bc0-4a68-9279-f6f3b6cbd3c3')/Items(2)

      否则,我的电话与上面的例子相同。

      我收到错误消息:

      {"error":{"code":"-1, Microsoft.SharePoint.Client.InvalidClientQueryException","message":{"lang":"en-US","value":"The parameter __metadata does not exist in method GetById."}}}

      我不明白我做错了什么!我在任何地方都找不到任何具体的例子。

      来自页面:http://msdn.microsoft.com/en-us/library/office/dn292553%28v=office.15%29.aspx

      If you want to update a file's metadata, you'll have to construct an endpoint that reaches the file as a list item. You can do this because each folder is also a list, and each file is also a list item. Construct an endpoint that looks like this: https: //siteurl/_api/web/lists/getbytitle('Documents')/items(). Working with lists and list items with REST explains how to update a list item's metadata.

      任何人都可以提供任何见解吗?

      更新:

      似乎X-HTTP-Method未正确设置。我解决了这个问题,现在我得到了:

      {"error":{"code":"-1, Microsoft.SharePoint.Client.InvalidClientQueryException","message":{"lang":"en-US","value":"An unexpected 'PrimitiveValue' node was found when reading from the JSON reader. A 'StartObject' node was expected."}}}

1 个答案:

答案 0 :(得分:0)

我在亲自调查时遇到了你的问题。我已经记录了如何使用不需要JQuery的HttpClient来完成文件上传,创建,更新和检索列表项,包括那些包含Termstore数据的列表项。

使用REST从HttpClient更新文件的示例:

client = new HttpClient(new HttpClientHandler() { UseDefaultCredentials = true }); client.BaseAddress = new System.Uri(url); client.DefaultRequestHeaders.Clear(); client.DefaultRequestHeaders.Add("X-RequestDigest", digest); client.DefaultRequestHeaders.Add("X-HTTP-Method", "MERGE"); client.DefaultRequestHeaders.Add("IF-MATCH", "*"); HttpContent strContent = new StringContent(String.Concat("{ '__metadata': { 'type': 'SP.List' }, 'Title': '", filename, "' }")); strContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); strContent.Headers.ContentType.Parameters.Add(new NameValueHeaderValue("odata", "verbose")); HttpResponseMessage updateResponse = await client.PostAsync(String.Concat("_api/web/lists/GetByTitle('Project Photos')/Items(", id, ")"), strContent); updateResponse.EnsureSuccessStatusCode(); if (updateResponse.IsSuccessStatusCode) {}

https://arcandotnet.wordpress.com/2015/04/01/sharepoint-2013-rest-services-using-c-and-the-httpclient-for-windows-store-apps/

希望这有帮助。

Arcan.NET