繁体   English   中英

用于 Sharepoint 搜索文档身份验证问题的 C# REST API

[英]C# REST API for Sharepoint search document authentication issue

我正在尝试使用以下代码搜索 sharepoint 文档:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

namespace AppConsole
{
    public class Program
    {
        public static async Task Main(string[] args)
        {  

            System.Net.Http.HttpClient client = new HttpClient();
             string WebUri= "https://company.sharepoint.com/_api/search/query?querytext='documentname'";

            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(string.Format("{0}:{1}", "username", "password"))));

            using (client)
            {
                HttpResponseMessage httpResponseMessage = await client.GetAsync(webUri);
                HttpResponseMessage responsemMsgx = httpResponseMessage;
                if (responsemMsgx.IsSuccessStatusCode)
                {
                    Console.Writeline("responsemMsgx");
                }
            }
        }



    }
}

我在运行程序和调试时收到 403 禁止消息,我认为身份验证存在问题。 请建议一种有效的身份验证方法。

我也试过下面的代码,但它不起作用:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Security;
using System.Threading.Tasks;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System.Configuration;

namespace AppConsoleSharePoint
{
    public class Program
    {
        private static string listTitle;

        public static object JToken { get; private set; }

        public static async Task Main(string[] args)
        {
            var webUri = new Uri("https://XXXXXX.sharepoint.com");
            const string userName = "XXXXXXXX";
            const string password = "XXXXXX";
            var securePassword = new SecureString();
            foreach (var c in password)
            {
                securePassword.AppendChar(c);
            }
            var credentials = new SharePointOnlineCredentials(userName, securePassword);

            object list = GetList(webUri, credentials, "Contacts");
            //print List title
          //  Console.WriteLine(list["Title"]);
        }

        private static object GetList(Uri webUri, SharePointOnlineCredentials credentials, string v)
        {
            throw new NotImplementedException();
        }

        public static JToken GetList(Uri webUri, ICredentials credentials, string listTitle)
        {
            using (var client = new WebClient())
            {
                client.Headers.Add("X-FORMS_BASED_AUTH_ACCEPTED", "f");
                client.Credentials = credentials;
                client.Headers.Add(HttpRequestHeader.ContentType, "application/json;odata=verbose");
                client.Headers.Add(HttpRequestHeader.Accept, "application/json;odata=verbose");
                var endpointUri = new Uri(baseUri: webUri, string.Format("/_api/web/lists/getbytitle('{0}')", listTitle));
                var result = client.DownloadString(endpointUri);
                return JToken.Parse(result)["d"];
            }
        }
    }
}

但是,我在返回 JToken.Parse(result)["d"] 时出错; 例外:严重性代码描述项目文件行抑制状态错误 CS1061“对象”不包含“解析”的定义,并且无法找到接受“对象”类型的第一个参数的可访问扩展方法“解析”(您是否缺少使用指令或程序集引用?)活动

请帮忙。

以下代码供大家参考。

string siteUrl = "https://tenant.sharepoint.com/sites/team";
string userName = "test@tenant.onmicrosoft.com";
string password = "xxx";
string searchQuery = "/_api/search/query?querytext='documentname IsDocument:True'";

var securePassword = new SecureString();
foreach (char c in password.ToCharArray()) securePassword.AppendChar(c);

var credential = new SharePointOnlineCredentials(userName, securePassword);
HttpClientHandler handler = new HttpClientHandler() { Credentials = credential };

Uri uri = new Uri(siteUrl);
handler.CookieContainer.SetCookies(uri, credential.GetAuthenticationCookie(uri));

HttpClient client = new HttpClient(handler);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Add("Accept", "application/json;odata=verbose");
client.DefaultRequestHeaders.Add("ContentType", "application/json;odata=verbose");

var result = client.GetAsync(siteUrl + searchQuery).Result;
var content = result.Content.ReadAsStringAsync().Result;
JObject jobj = JObject.Parse(content);
JArray jarr = (JArray)jobj["d"]["query"]["PrimaryQueryResult"]["RelevantResults"]["Table"]["Rows"]["results"];
foreach (JObject j in jarr)
{
    JArray results = (JArray)j["Cells"]["results"];
    var title = "";
    var path = "";
    foreach (JObject r in results)
    {
        if (r["Key"] != null)
        {
            if (r["Key"].ToString() == "Title")
            {
                title = r["Value"].ToString();
            }
            if (r["Key"].ToString() == "Path")
            {
                path = r["Value"].ToString();
            }
        }
    }
    Console.WriteLine(title + "|" + path);
}
Console.ReadKey();  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM