Ich möchte die Web Api Arbeit über SPO bekommen. Ich habe den Beispielcode https://blogs.msmvps.com/windsor/2017/03/12/walkthrough-building-a-custom-web-api-for-use-with-sharepoint-online/ und es funktioniert gut.Sharepoint Online Web Api Bearer Fehler 401
Jetzt möchte ich eine Get-Anfrage zu SPO hinzufügen, die auch vor Ort funktioniert. Ich habe versucht, eine Datei mit clientcontext und Webclient zu lesen, was ich bevorzugen würde. Aber ich bekomme immer einen Fehler 401 "der Remote-Server zurückgegeben einen Fehler (401) nicht autorisiert"
Ich verstehe nicht den Fehler 401, weil der Beispielcode funktioniert gut. Ich sehe keine Unterschiede.
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;
}
Hier ist mein Code-Schnipsel:
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)
{ [...]
}
}
den Code auf SPO Um zu testen, habe ich zu Testzwecken verwendet 'client.Credentials = new SharePointOnline Anmeldeinformationen (Benutzername, passWord); ' Der Code ist in Ordnung und alles funktioniert, aber ich möchte keine Anmeldeinformationen verwenden. Die API muss mit einem Token authentifiziert werden. –