首页 文章

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

提问于
浏览
0

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

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

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

  • 上传文件(POST)

例如baseURL“web /”“GetFolderByServerRelativeUrl('/ sites”libPath“')/ Files / Add(url ='”filename“',overwrite = true)”;

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

例如baseURL“web / lists / getbytitle('”docLibName“')/ items?$ filter = Title eq'”filenameNoExt“'”

前两个步骤正常 .

  • 更新元数据

这是导致我不眠之夜的一点点 . 我似乎无法弄清楚我应该发送到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中返回的内容;我正在尝试将证书类型字段设置为指定的值,而不是文档 Headers :

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

    我亲自调查时遇到了你的问题 . 我已经记录了如何使用不需要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

相关问题