[英]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.