سؤال

أحاول إرسال طلب نشر إلى SharePoint Online (موقع المصادقة المستند إلى المطالبات) من تطبيق العميل (تطبيق WPF).في هذه الحالة، يجب أن يكون تحديثًا لعنصر القائمة لتغيير "العنوان" إلى "اختبار".

أقوم باسترداد CookieContainer عبر فئة MsOnlineClaimsHelperوالذي يعيد لي رمز المصادقة بنجاح.

لكن عندما أحاول إرسال الطلب يكون الرد The remote server returned an error: (403) Forbidden.

رمز طلب الويب

try
{
    var claimshelper = new MsOnlineClaimsHelper(baseUrl, _userName, _password);
    var request = (HttpWebRequest)WebRequest.Create(baseUrl + "/" + url);

    request.CookieContainer = claimshelper.CookieContainer;
    request.Method = "POST";
    request.Headers.Add("X-HTTP-Method", "MERGE");
    request.Headers.Add("If-Match", "*");
    request.Accept = "application/json;odata=verbose";

    using (var streamWriter = new StreamWriter(request.GetRequestStream()))
    {
        streamWriter.Write(json);
        streamWriter.Flush();
    }

    var webResp = request.GetResponse() as HttpWebResponse;
    var theData = new StreamReader(webResp.GetResponseStream(), true);
    string payload = theData.ReadToEnd();
}
catch (Exception ex)
{


}

رابط الراحة:

/_api/lists/getbytitle('SampleList')/items(1)

حمولة Json:

string json = "{ '__metadata': { 'type': 'SP.Data.SampleListListItem' }, 'Title': 'Test'}";

خطأ:

The remote server returned an error: (403) Forbidden.

هل كانت مفيدة؟

المحلول

يحدث هذا الخطأ منذ خدمة SharePoint 2013 REST يتطلب المستخدم ليشمل أ Request Digest القيمة مع كل create, update و delete عملية.يتم بعد ذلك استخدام هذه القيمة بواسطة SharePoint لتحديد الطلبات غير الحقيقية.

كيفية توفير قيمة ملخص الطلب

في MsOnlineClaimsHelper class (MsOnlineClaimsHelper.cs file) أضف الطريقة التالية لطلب قيمة ملخص النموذج:

/// <summary>
/// Request Form Digest value
/// </summary>
/// <returns></returns>
private string GetFormDigest()
{
    var endpoint = "/_api/contextinfo";
    var request = (HttpWebRequest) WebRequest.Create(_host.AbsoluteUri + endpoint);

    request.CookieContainer = new CookieContainer();
    request.Method = "POST";
    //request.Accept = "application/json;odata=verbose";
    request.ContentLength = 0;

    using (var response = (HttpWebResponse)request.GetResponse())
    {
         using (var reader = new StreamReader(response.GetResponseStream()))
         {
             var result = reader.ReadToEnd();

             // parse the ContextInfo response
             var resultXml = XDocument.Parse(result);

             // get the form digest value
             var e = from e in resultXml.Descendants()
                                 where e.Name == XName.Get("FormDigestValue", "http://schemas.microsoft.com/ado/2007/08/dataservices")
                            select e;
             _formDigest = e.First().Value;   
         }
    }
    return _formDigest;
}

و FormDigest ملكية:

private string _formDigest;
public string FormDigest
{
    get
    {
       if (_formDigest == null || DateTime.Now > _expires)
       {
           return GetFormDigest();
       }
       return _formDigest;
    }
}

كيفية إجراء عملية تحديث لعنصر القائمة باستخدام SharePoint 2013 REST API

يوضح المثال التالي كيفية إجراء تحديث لعنصر قائمة باستخدام التطبيق المتوفر لطلب ملخص النموذج

النقاط الرئيسية:

  • X-RequestDigest يتم استخدام الرأس لتحديد قيمة ملخص النموذج
  • طلب Content Type يجب أن يتم تحديدها

مثال:

var userName = "username@contoso.onmicrosoft.com";
var password = "password";
var payload = "{ '__metadata': { 'type': 'SP.Data.TasksListItem' }, 'Title': 'New Tasl'}";  //for a Task Item


try
{
    var claimshelper = new MsOnlineClaimsHelper(baseUrl, _userName, _password);
    var request = (HttpWebRequest)WebRequest.Create(baseUrl + "/" + endpointUrl);

    request.CookieContainer = claimshelper.CookieContainer;
    request.Headers.Add("X-RequestDigest", claimshelper.FormDigest);
    request.Method = "POST";
    request.Headers.Add("X-HTTP-Method", "MERGE");
    request.Headers.Add("If-Match", "*");
    request.Accept = "application/json;odata=verbose";
    request.ContentType = "application/json;odata=verbose";

    using (var writer = new StreamWriter(request.GetRequestStream()))
    {
        writer.Write(payload);
        writer.Flush();
    }

    var response = request.GetResponse() as HttpWebResponse;
    //...
 }
 catch (Exception ex)
 {
    //Error handling goes here.. 
 }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top