我有一个C#控制台应用程序(当它完成时最终将成为一个Windows服务)。目的是将文档存储(500k +文档)迁移到SharePoint 2013。
请注意,这是一个独立的C#应用程序,可以在未安装SharePoint的服务器上运行。我通过HttpClient调用使用纯REST。
上传文档并设置元数据有3个步骤:
上传文件(POST)
e.g。 baseURL +“web /”+“GetFolderByServerRelativeUrl('/ sites”+ libPath +“')/ Files / Add(url ='”+ filename +“',overwrite = true)”;
检索与此文档关联的列表项的详细信息(GET)
e.g。 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中返回的内容;我正在尝试将证书类型字段设置为指定的值,而不是文档标题:
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."}}}
答案 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)
{}
希望这有帮助。
Arcan.NET