我正在创建WCF服务,在其中我要在共享点列表中执行CRUD操作。我已经通过REST成功从共享点列表中检索了数据,即通过网络凭据对象传递了凭据(用户名,密码,域),但不幸的是无法插入数据。错误是指在共享点中插入数据时未经授权的访问。然后,我尝试了Sharepoint在线凭据对象,但是没有运气。我需要一些帮助。
这是例外:
The remote server returned an error: (401) Unauthorized.
这是代码:
try
{
string userPassword = "password";
WebClient webClient = new WebClient();
SecureString securePassword = new SecureString();
for (int i = 0; i < userPassword.Length; i++)
{
securePassword.AppendChar(userPassword[i]);
}
webClient.Credentials = new SharePointOnlineCredentials(@"username@domain", securePassword);
webClient.Headers.Add("Content-type", "application/json");
webClient.Headers.Add("Accept", "application/json;odata=verbose");
webClient.Headers.Add("user-agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36");
webClient.Encoding = Encoding.UTF8;
string msg = webClient.UploadString("http://abc:9211/sites/api/_api/web/lists/getbytitle('list_name')/Items", "POST", "{__metadata\":{\"type\":\"SP.Data.SubscriptionListItem\"},\"UserID\":\"user\",\"SubscriptionType\":\"Type1\",\"Title\":\"Testing\"}");
}
catch(WebException ex)
{
}
发生此错误的原因是,在执行Request Digest
SharePoint Online / Office 365请求期间必须指定执行创建,更新或删除操作的值。
Request Digest
X-RequestDigest
标头存储安全验证令牌,该令牌可帮助防止攻击类型,从而使用户被诱骗而将数据发布到服务器而不知道。
using System;
using System.Net;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace SPORestClient
{
/// <summary>
/// Client for performing CRUD operations against List resource in SharePoint Online (SPO)
/// </summary>
public class ListsClient : IDisposable
{
public ListsClient(Uri webUri, ICredentials credentials)
{
_client = new WebClient();
_client.Credentials = credentials;
_client.Headers.Add("X-FORMS_BASED_AUTH_ACCEPTED", "f");
_client.Headers.Add(HttpRequestHeader.ContentType, "application/json;odata=verbose");
_client.Headers.Add(HttpRequestHeader.Accept, "application/json;odata=verbose");
WebUri = webUri;
}
public void InsertListItem(string listTitle, object payload)
{
var formDigestValue = RequestFormDigest();
_client.Headers.Add("X-RequestDigest", formDigestValue);
var endpointUri = new Uri(WebUri, string.Format("/_api/web/lists/getbytitle('{0}')/items", listTitle));
var payloadString = JsonConvert.SerializeObject(payload);
_client.Headers.Add(HttpRequestHeader.ContentType, "application/json;odata=verbose");
_client.UploadString(endpointUri, "POST", payloadString);
}
/// <summary>
/// Request Form Digest
/// </summary>
/// <returns></returns>
private string RequestFormDigest()
{
var endpointUri = new Uri(WebUri, "_api/contextinfo");
var result = _client.UploadString(endpointUri, "POST");
JToken t = JToken.Parse(result);
return t["d"]["GetContextWebInformation"]["FormDigestValue"].ToString();
}
public Uri WebUri { get; private set; }
public void Dispose()
{
_client.Dispose();
GC.SuppressFinalize(this);
}
private readonly WebClient _client;
}
}
要点:[ListsClient.cs] [2]
注意:由于SharePoint要求用户在每个创建,更新和删除操作中都包含一个请求摘要值,因此将调用另一个请求,以使用
RequestFormDigest method
包含请求摘要值的Context Info实体进行请求。
-
依赖性:[Json.NET库] [1]
用法
下面的示例演示如何在Contacts
列表中创建列表项:
using (var client = new ListsClient(webUri, credentials))
{
var contactEntry = new
{
__metadata = new { type = "SP.Data.ContactsListItem" },
Title = "John Doe"
};
client.InsertListItem("Contacts", contactEntry);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句