C# 通过CSOM检索定期事件的所有实例

C# 通过CSOM检索定期事件的所有实例,c#,rest,sharepoint-2013,sharepoint-api,sharepoint-online,C#,Rest,Sharepoint 2013,Sharepoint Api,Sharepoint Online,我需要通过CSOM在线获取Sharepoint 2013中定期日历事件的所有实例。我读到它无法完成,我需要直接通过RESTAPI来完成 我的问题: 1) 是否可以从视图而不是列表中获取项目,因为日历附带了一个默认视图,在该视图中我可以查看定期事件的所有实例 2) 我有一个通过REST un C检索数据的例子,它工作得很好,但我似乎无法向其中添加Caml查询(在C中) 以下是我的非工作代码: HttpWebRequest itemRequest = (HttpWeb

我需要通过CSOM在线获取Sharepoint 2013中定期日历事件的所有实例。我读到它无法完成,我需要直接通过RESTAPI来完成

我的问题:

1) 是否可以从视图而不是列表中获取项目,因为日历附带了一个默认视图,在该视图中我可以查看定期事件的所有实例

2) 我有一个通过REST un C检索数据的例子,它工作得很好,但我似乎无法向其中添加Caml查询(在C中) 以下是我的非工作代码:

HttpWebRequest itemRequest =
                (HttpWebRequest)HttpWebRequest.Create(sharepointUrl.ToString() + "/_api/Web/lists/getbytitle('" + listName + "')/Items");
            itemRequest.Method = "POST";
            itemRequest.Accept = "application/atom+xml";
            itemRequest.ContentType = "application/atom+xml;type=entry";
            itemRequest.Headers.Add("Authorization", "Bearer " + accessToken);
            using (var writer = new StreamWriter(itemRequest.GetRequestStream()))
            {
                writer.Write(@"{ 'query' : {'__metadata': { 'type': 'SP.CamlQuery' }, 'ViewXml': '<View><Query><Where><Eq><FieldRef Name='Title'/><Value Type='Text'>little test</Value></Eq></Where></Query></View>' } }");
            }

            HttpWebResponse itemResponse = (HttpWebResponse)itemRequest.GetResponse();
HttpWebRequest itemRequest=
(HttpWebRequest)HttpWebRequest.Create(sharepointUrl.ToString()+“/”api/Web/lists/getbytitle(“+listName+”)/Items”);
itemRequest.Method=“POST”;
itemRequest.Accept=“application/atom+xml”;
itemRequest.ContentType=“应用程序/atom+xml;类型=条目”;
itemRequest.Headers.Add(“授权”、“承载人”+accessToken);
使用(var writer=newstreamwriter(itemRequest.GetRequestStream()))
{
Write(@“{'query':{'uuu metadata':{'type':'SP.CamlQuery'},'ViewXml':'littletest'}”);
}
HttpWebResponse itemResponse=(HttpWebResponse)itemRequest.GetResponse();
我得到500个内部服务器错误

有什么想法吗??
谢谢

我建议您利用REST来检查SharePoint RESTfull web服务请求

在您的情况下,端点不正确。由于需要通过CAML查询请求列表项,请从以下位置替换端点url:

/_api/Web/lists/getbytitle('" + listName + "')/Items
对于这一点:

/_api/Web/lists/getbytitle('" + listName + "')/getitems
其次,
application/atom+xml;type=entry
HTTP
Content-type
header在POST请求中不受支持(请参阅下面支持的MIME类型列表)。因此,更换线路:

itemRequest.Accept = "application/atom+xml";
itemRequest.ContentType = "application/atom+xml;type=entry";
例如,对于这些:

itemRequest.Accept = "application/json";
itemRequest.ContentType = "application/json";
就这样

支持的MIME类型列表
  • 应用程序/json;odata=最小元数据;流=真
  • 应用程序/json;odata=最小元数据;流=假
  • 应用程序/json;odata=最小元数据
  • 应用程序/json;odata=完整元数据;流=真
  • 应用程序/json;odata=完整元数据;流=假
  • 应用程序/json;odata=fullmetadata
  • 应用程序/json;odata=nometadata;流=真
  • 应用程序/json;odata=nometadata;流=假
  • 应用程序/json;odata=nometadata
  • 应用程序/json;流=真
  • 应用程序/json;流=假
  • 应用程序/json;odata=冗长
  • 应用程序/json

您还可以利用以下类来执行REST请求:

public class SPRestExecutor
{

    public SPRestExecutor(Uri webUri,string accessToken)
    {
        WebUri = webUri;
        AccessToken = accessToken;
    }



    public JObject ExecuteJsonWithDigest(string endpointUrl, HttpMethod method, IDictionary<string, string> headers, JObject payload)
    {
        var formDigestValue = RequestFormDigest();
        var finalHeaders = new Dictionary<string, string>();
        if (headers != null)
        {
            foreach (var key in headers.Keys)
            {
                finalHeaders.Add(key, headers[key]);
            }
        }
        finalHeaders.Add("X-RequestDigest", formDigestValue);

        var result = ExecuteJson(endpointUrl, method, finalHeaders, payload);
        return result;
    }


    public JObject ExecuteJson(string endpointUrl, HttpMethod method, IDictionary<string, string> headers, JObject payload)
    {
        var request = (HttpWebRequest)WebRequest.Create(WebUri.ToString() + endpointUrl);
        request.Headers.Add(HttpRequestHeader.Authorization, "Bearer " + AccessToken);
        request.Method = method.Method;
        request.Accept = "application/json;odata=verbose";
        request.ContentType = "application/json;odata=verbose";
        if (payload != null)
        {
            using (var writer = new StreamWriter(request.GetRequestStream()))
            {
                writer.Write(payload);
                writer.Flush();
            }
        }
        using (var response = (HttpWebResponse)request.GetResponse())
        {
            using(var responseStream = response.GetResponseStream())
            {
                using (var reader = new StreamReader(responseStream))
                {
                    var result = reader.ReadToEnd();
                    return JObject.Parse(result);
                }
            }
        }
    }


    /// <summary>
    /// Request Form Digest
    /// </summary>
    /// <returns></returns>
    protected string RequestFormDigest()
    {
        var result = ExecuteJson("/_api/contextinfo", HttpMethod.Post, null, null);
        return result["d"]["GetContextWebInformation"]["FormDigestValue"].ToString();
    }


    public string AccessToken { get; private set; }


    public Uri WebUri { get; private set; }
}
公共类SPRestExecutor
{
公共存储执行器(Uri webUri,字符串访问令牌)
{
WebUri=WebUri;
AccessToken=AccessToken;
}
PublicJobject ExecuteJsonWithDigest(字符串端点URL、HttpMethod方法、IDictionary头、JObject负载)
{
var formDigestValue=RequestFormDigest();
var finalHeaders=新字典();
如果(标题!=null)
{
foreach(headers.Keys中的var键)
{
添加(key,headers[key]);
}
}
添加(“X-RequestDigest”,formDigestValue);
var result=ExecuteJson(端点URL、方法、最终标题、有效负载);
返回结果;
}
public JObject ExecuteJson(字符串端点URL、HttpMethod方法、IDictionary头、JObject负载)
{
var request=(HttpWebRequest)WebRequest.Create(WebUri.ToString()+endpointUrl);
request.Headers.Add(HttpRequestHeader.Authorization,“Bearer”+AccessToken);
request.Method=Method.Method;
request.Accept=“application/json;odata=verbose”;
request.ContentType=“application/json;odata=verbose”;
如果(有效负载!=null)
{
使用(var writer=newstreamwriter(request.GetRequestStream()))
{
writer.Write(有效载荷);
writer.Flush();
}
}
使用(var response=(HttpWebResponse)request.GetResponse())
{
使用(var responseStream=response.GetResponseStream())
{
使用(变量读取器=新的流读取器(responseStream))
{
var result=reader.ReadToEnd();
返回JObject.Parse(结果);
}
}
}
}
/// 
///申请表格摘要
/// 
/// 
受保护的字符串RequestFormDigest()
{
var result=ExecuteJson(“/_api/contextinfo”,HttpMethod.Post,null,null);
返回结果[“d”][“GetContextWebInformation”][“FormDigestValue”]。ToString();
}
公共字符串AccessToken{get;private set;}
公共Uri WebUri{get;private set;}
}

用法

var client=new-SPRestExecutor(webUri,accessToken);
var payload=JObject.Parse(@“{'query':{'uuuu metadata':{'type':'SP.CamlQuery'},'ViewXml':''}”);
var data=client.ExecuteJson(“/_api/web/lists/getbytitle('Documents')/getitems”,HttpMethod.Post,null,payload);

谢谢瓦迪姆·格雷米切夫,你的帖子让我走上了正轨

我有3个问题,第一个问题是调用“Items”而不是“getItems”,第二个问题是使用“application/atom+xml;type=entry”作为ContentType(正如Vadim所述)

第三个也是最后一个问题是在整个查询中使用简单的引号。在ViewXml中,我使用了scaped双引号,这样它们就不会与关闭ViewXml元素的双引号混淆

因此,工作代码最终是这样的:

byte[] data = new ASCIIEncoding().GetBytes("{ 'query' : {'__metadata': { 'type': 'SP.CamlQuery' }, 'ViewXml': '<View><Query><Where><Eq><FieldRef Name=\"Title\"/><Value Type=\"Text\">little test</Value></Eq></Where></Query></View>' } }");

        HttpWebRequest itemRequest =
            (HttpWebRequest)HttpWebRequest.Create(sharepointUrl.ToString() + "/_api/Web/lists/getbytitle('" + listName + "')/getitems");
        itemRequest.Method = "POST";
        itemRequest.ContentType = "application/json; odata=verbose";
        itemRequest.Accept = "application/atom+xml";
        itemRequest.Headers.Add("Authorization", "Bearer " + accessToken);

        itemRequest.ContentLength = data.Length;
        Stream myStream = itemRequest.GetRequestStream();
        myStream.Write(data, 0, data.Length);
        myStream.Close();         

        HttpWebResponse itemResponse = (HttpWebResponse)itemRequest.GetResponse();
byte[]data=new-ascienceoding().GetBytes(“{query':{uuuu-metadata':{'type':'SP.CamlQuery'},'ViewXml':'littletest'}”);
HttpWebRequestItemRequest=
(HttpWebRequest)HttpWebRequest.Create(sharepointUrl.ToString()+“/”api/Web/lists/getbytitle(“+listName+”)/getitems”);
byte[] data = new ASCIIEncoding().GetBytes("{ 'query' : {'__metadata': { 'type': 'SP.CamlQuery' }, 'ViewXml': '<View><Query><Where><Eq><FieldRef Name=\"Title\"/><Value Type=\"Text\">little test</Value></Eq></Where></Query></View>' } }");

        HttpWebRequest itemRequest =
            (HttpWebRequest)HttpWebRequest.Create(sharepointUrl.ToString() + "/_api/Web/lists/getbytitle('" + listName + "')/getitems");
        itemRequest.Method = "POST";
        itemRequest.ContentType = "application/json; odata=verbose";
        itemRequest.Accept = "application/atom+xml";
        itemRequest.Headers.Add("Authorization", "Bearer " + accessToken);

        itemRequest.ContentLength = data.Length;
        Stream myStream = itemRequest.GetRequestStream();
        myStream.Write(data, 0, data.Length);
        myStream.Close();         

        HttpWebResponse itemResponse = (HttpWebResponse)itemRequest.GetResponse();