API OneDrive зависает при инициализации, но работает нормально через браузер
У нас есть эта интеграция с OneDrive для бизнеса, которая позволяет пользователям просматривать свои файлы и прикреплять их, но для этого одного пользователя в клиенте мы всегда получаем следующую ошибку при попытке вызвать API: "Запрашиваемый ресурс автоматически выделяется. Пожалуйста, попробуйте еще раз через несколько минут. Что совершенно нормально, если пользователь новый, но этот конкретный пользователь получал одно и то же сообщение об ошибке в течение более 2 недель. Доступ к onedrive из браузера работает нормально, и на диске есть и папки, и файлы, поэтому кажется, что пользователь оказался в этом странном состоянии.
Не совсем уверен, как ее решить, и я не думаю, что это проблема в том, как мы называем API, так как он отлично работает для любого другого пользователя в том же арендаторе. Хотя в итоге я написал минимальный объем кода, который мы все равно используем для доступа к onedrive, я могу убедиться, что у меня по-прежнему возникает та же ошибка:
class Program
{
static void Main(string[] args)
{
var token = "...";
var user = "...";
var client = new OneDriveClient(new AppConfig
{
ActiveDirectoryAppId = "...",
ActiveDirectoryClientSecret = "...",
ActiveDirectoryReturnUrl = "...",
ActiveDirectoryServiceEndpointUrl = "https://<REDACTED>-my.sharepoint.com/_api/v2.0",
ActiveDirectoryServiceResource = "https://<REDACTED>-my.sharepoint.com"
}, new AdalCredentialCache(), new HttpProvider(), new TestServiceInfoProvider(token, user), ClientType.Business);
client.AuthenticateAsync().Wait();
var result = client.Drive.Root.Children.Request().GetAsync().Result;
}
class TestServiceInfoProvider : ServiceInfoProvider
{
private readonly string _token;
private readonly string _userName;
public TestServiceInfoProvider(string token, string userName)
{
_token = token;
_userName = userName;
}
public override async Task<ServiceInfo> GetServiceInfo(AppConfig appConfig, CredentialCache credentialCache, IHttpProvider httpProvider, ClientType clientType)
{
var serviceInfo = await base.GetServiceInfo(appConfig, credentialCache, httpProvider, clientType).ConfigureAwait(false);
serviceInfo.BaseUrl = appConfig.ActiveDirectoryServiceEndpointUrl;
serviceInfo.ServiceResource = appConfig.ActiveDirectoryServiceResource;
if (serviceInfo.AuthenticationProvider == null)
serviceInfo.AuthenticationProvider = new TestAuthenticationProvider(serviceInfo, _token, _userName);
return serviceInfo;
}
}
class TestAuthenticationProvider : IAuthenticationProvider
{
private readonly ServiceInfo _serviceInfo;
private readonly string _token;
private readonly string _userName;
public TestAuthenticationProvider(ServiceInfo serviceInfo, string token, string userName)
{
_serviceInfo = serviceInfo;
_token = token;
_userName = userName;
}
public async Task AppendAuthHeaderAsync(HttpRequestMessage request)
{
if (CurrentAccountSession == null)
await AuthenticateAsync().ConfigureAwait(false);
if (!string.IsNullOrEmpty(CurrentAccountSession?.AccessToken))
request.Headers.Authorization = new AuthenticationHeaderValue(Constants.Headers.Bearer, CurrentAccountSession.AccessToken);
}
public Task<AccountSession> AuthenticateAsync()
{
if (CurrentAccountSession != null && !CurrentAccountSession.IsExpiring())
return Task.FromResult(CurrentAccountSession);
CurrentAccountSession = new AccountSession
{
AccessToken = _token,
AccessTokenType = Constants.Headers.Bearer,
AccountType = AccountType.ActiveDirectory,
CanSignOut = false,
ClientId = _serviceInfo.AppId,
ExpiresOnUtc = DateTimeOffset.MaxValue,
UserId = _userName
};
return Task.FromResult(CurrentAccountSession);
}
public Task SignOutAsync() => null;
public AccountSession CurrentAccountSession { get; set; }
}
}
Использование Microsoft.OneDriveSDK версии 1.1.47.