Sharepoint Online Web Api 承载错误 401
Sharepoint Online Web Api Bearer Error 401
我想让 Web Api 在 SPO 上运行。
我做了 https://blogs.msmvps.com/windsor/2017/03/12/walkthrough-building-a-custom-web-api-for-use-with-sharepoint-online/ 的示例代码,它工作正常。
现在我想向 SPO 添加一个 get-Request,它也可以在内部运行。
我尝试使用我更喜欢的 clientcontext 和 Webclient 读取一个文件。
但我总是收到 401 错误 "the remote server returned an error (401) unauthorized"
我不明白 401 错误,因为示例代码工作正常。我没有看到任何差异。
public async Task<IEnumerable<string>> GetUserInfo(string sharePointUrl)
{
var results = new List<string>();
try
{
var userToken = this.Request.Headers.Authorization.Parameter;
var newToken = await GetSharePointAccessToken(sharePointUrl, userToken);
using (var context = new ClientContext(sharePointUrl))
{
context.ExecutingWebRequest +=
(s, e) => e.WebRequestExecutor.WebRequest.Headers.Add(
"Authorization", "Bearer " + newToken);
var web = context.Web;
var user = web.CurrentUser;
context.Load(user);
context.ExecuteQuery();
results.Add(user.Title);
results.Add(user.LoginName);
results.Add(user.Email);
}
}
catch (Exception ex)
{
results.Add(ex.ToString());
}
return results;
}
这是我的代码片段:
public async Task<IEnumerable<LessVariables>> GetLess(string url, string id)
{
[...]
var list = new List<LessVariables>();
try
{
var userToken = this.Request.Headers.Authorization.Parameter;
var newToken = await GetSharePointAccessToken(url, userToken);
var siteUrl = url;
var file = siteUrl + "/Style Library/xxx/less/" + id + ".less";
var files = "/Style Library/xxx/less/" + id + ".less";
using (var context = new ClientContext(url))
{
context.ExecutingWebRequest +=
(s, e) => e.WebRequestExecutor.WebRequest.Headers.Add(
"Authorization", "Bearer " + newToken);
context.AuthenticationMode = ClientAuthenticationMode.Default;
context.ExecuteQuery();
var fileInfo = Microsoft.SharePoint.Client.File.OpenBinaryDirect(context, files);
// After this line I get the 401 error
using (WebClient client = new WebClient())
{
client.Headers[HttpRequestHeader.Authorization] = "Bearer " + newToken;
//client.UseDefaultCredentials = true;
string s = client.DownloadString(file);
// After try to DownloadString I got the 401 error.
var regex = new Regex(@"(?<name>[@].*:)\s(?<value>.*)(;)");
var matches = regex.Matches(s);
var parameters = new List<KeyValuePair<string, string>>();
foreach (var match in matches.Cast<Match>())
{
list.Add(new LessVariables
{
key = match.Groups["name"].Value,
value = match.Groups["value"].Value
});
}
}
}
return list;
}
catch (Exception ex)
{ [...]
}
}
您在读取文件时遇到此行为的原因是请求 http://<site url>//<folder name>/<file name>
导致重定向,但 WebClient
在遵循重定向时删除授权 headers(例如 Bearer 令牌) . this post 中解释了类似的行为。
由于您的目标是 SharePoint Online,您可以使用 不会导致重定向 的不同方法检索文件内容,例如使用 SharePoint REST API,特别是以下 File resource 端点:
Url: http://<site url>/_api/web/getfilebyserverrelativeurl('/<folder name>/<file name>')/$value
Method: Get
例子
using (var client = new WebClient())
{
client.Headers[HttpRequestHeader.Authorization] = "Bearer " + accessToken;
var content = client.DownloadString("https://contoso.sharepoint.com/_api/web/getfilebyserverrelativeurl('/Shared%20Documents/Guide.docx')/$value");
//...
}
我想让 Web Api 在 SPO 上运行。 我做了 https://blogs.msmvps.com/windsor/2017/03/12/walkthrough-building-a-custom-web-api-for-use-with-sharepoint-online/ 的示例代码,它工作正常。
现在我想向 SPO 添加一个 get-Request,它也可以在内部运行。 我尝试使用我更喜欢的 clientcontext 和 Webclient 读取一个文件。 但我总是收到 401 错误 "the remote server returned an error (401) unauthorized"
我不明白 401 错误,因为示例代码工作正常。我没有看到任何差异。
public async Task<IEnumerable<string>> GetUserInfo(string sharePointUrl)
{
var results = new List<string>();
try
{
var userToken = this.Request.Headers.Authorization.Parameter;
var newToken = await GetSharePointAccessToken(sharePointUrl, userToken);
using (var context = new ClientContext(sharePointUrl))
{
context.ExecutingWebRequest +=
(s, e) => e.WebRequestExecutor.WebRequest.Headers.Add(
"Authorization", "Bearer " + newToken);
var web = context.Web;
var user = web.CurrentUser;
context.Load(user);
context.ExecuteQuery();
results.Add(user.Title);
results.Add(user.LoginName);
results.Add(user.Email);
}
}
catch (Exception ex)
{
results.Add(ex.ToString());
}
return results;
}
这是我的代码片段:
public async Task<IEnumerable<LessVariables>> GetLess(string url, string id)
{
[...]
var list = new List<LessVariables>();
try
{
var userToken = this.Request.Headers.Authorization.Parameter;
var newToken = await GetSharePointAccessToken(url, userToken);
var siteUrl = url;
var file = siteUrl + "/Style Library/xxx/less/" + id + ".less";
var files = "/Style Library/xxx/less/" + id + ".less";
using (var context = new ClientContext(url))
{
context.ExecutingWebRequest +=
(s, e) => e.WebRequestExecutor.WebRequest.Headers.Add(
"Authorization", "Bearer " + newToken);
context.AuthenticationMode = ClientAuthenticationMode.Default;
context.ExecuteQuery();
var fileInfo = Microsoft.SharePoint.Client.File.OpenBinaryDirect(context, files);
// After this line I get the 401 error
using (WebClient client = new WebClient())
{
client.Headers[HttpRequestHeader.Authorization] = "Bearer " + newToken;
//client.UseDefaultCredentials = true;
string s = client.DownloadString(file);
// After try to DownloadString I got the 401 error.
var regex = new Regex(@"(?<name>[@].*:)\s(?<value>.*)(;)");
var matches = regex.Matches(s);
var parameters = new List<KeyValuePair<string, string>>();
foreach (var match in matches.Cast<Match>())
{
list.Add(new LessVariables
{
key = match.Groups["name"].Value,
value = match.Groups["value"].Value
});
}
}
}
return list;
}
catch (Exception ex)
{ [...]
}
}
您在读取文件时遇到此行为的原因是请求 http://<site url>//<folder name>/<file name>
导致重定向,但 WebClient
在遵循重定向时删除授权 headers(例如 Bearer 令牌) . this post 中解释了类似的行为。
由于您的目标是 SharePoint Online,您可以使用 不会导致重定向 的不同方法检索文件内容,例如使用 SharePoint REST API,特别是以下 File resource 端点:
Url: http://<site url>/_api/web/getfilebyserverrelativeurl('/<folder name>/<file name>')/$value
Method: Get
例子
using (var client = new WebClient())
{
client.Headers[HttpRequestHeader.Authorization] = "Bearer " + accessToken;
var content = client.DownloadString("https://contoso.sharepoint.com/_api/web/getfilebyserverrelativeurl('/Shared%20Documents/Guide.docx')/$value");
//...
}