我正在尝试使用访问令牌访问 Share Point 站点,而不是在 CSOM 库中传递凭据。
访问端点时出现以下错误。 相同的代码适用于 Windows 窗体环境
ActiveX 控件 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' 无法实例化,因为当前线程不在单线程单元中。
我已尝试使用 Windows 窗体执行以下代码,并且它有效。 使用 Windows 窗体应用程序获取共享点站点的标题,但在 MVC Web API 中它会抛出错误
代码
// MVC Controller API End Point
[STAThread]
[Route("api/ATTitle")]
[HttpGet]
public async Task<string> ConsumeSPOWithOAuthAccessToken()
{
string title = "";
string targetSiteUrl = "https://xxxxxx.sharepoint.com/sites/documents";
//string returnUrl = "https://login.microsoftonline.com/common/oauth2/nativeclient";
var spoTenant = targetSiteUrl.Substring(0, targetSiteUrl.IndexOf('/', 8));
PublicClientApp = PublicClientApplicationBuilder.Create(clientId)
.WithDefaultRedirectUri()
.Build();
var _scopes = new String[] { $"{spoTenant}/AllSites.Read" };
var authResult = await PublicClientApp.AcquireTokenInteractive(_scopes).ExecuteAsync();
Console.WriteLine(authResult.AccessToken);
var handler = new JwtSecurityTokenHandler();
var token = handler.ReadJwtToken(authResult.AccessToken);
var authManager = new OfficeDevPnP.Core.AuthenticationManager();
using (var context = authManager.GetAzureADAccessTokenAuthenticatedContext(targetSiteUrl, authResult.AccessToken))
{
var web = context.Web;
context.Load(web, w => w.Title);
context.ExecuteQueryRetry();
title = web.Title;
}
return title;
}
任何帮助将不胜感激
谢谢
您遇到的错误表明代码正在尝试在不支持的环境中实例化 ActiveX 控件。这在 Web 应用程序(如 MVC Web API)中很常见,因为它们默认在多线程环境中运行,而 Windows 窗体在单线程单元 (STA) 环境中运行。要解决此问题,您可以在单线程单元线程上运行有问题的代码。