密码凭据背景传输
本文关键字:传输 背景 密码 | 更新日期: 2023-09-27 18:32:14
我正在创建新的后台传输并添加服务器凭据:
PasswordCredential webdavLogin = new PasswordCredential();
webdavLogin.UserName = ServerSettings.Values["serverUsername"].ToString();
webdavLogin.Password = ServerSettings.Values["serverPassword"].ToString();
uploader.ServerCredential = webdavLogin;
现在的问题是,每次我运行后台传输时,都会引发以下异常:
Exception from HRESULT: 0x80070565
The maximum number of secrets that may be stored in a single system has been exceeded
我搜索了凭据存储,但它是空的,没有存储凭据。我能做什么?
我遇到了完全相同的问题。BackgroundTransfer显然将它们添加到PasswordVault本身中。 您可以尝试不创建PasswordCredential的新实例,但确保它位于PasswordVault中(如果不存在则添加)并检索它。 这可能会阻止后台传输多次添加它。 您仍然需要注意手机上可以存储的最大凭据数...我想到了像161这样的奇怪数字,但我不确定。
或者,我所做的是,因为我只需要基本的身份验证,所以自己创建具有身份验证详细信息的请求标头(BackgroundUploader 的实例有一个您可以使用的方法 SetRequestHeader)。
var uploader = new BackgroundUploader
{
//ServerCredential = new PasswordCredential {UserName = uploadUser.Name, Password= uploadUser.Password}
};
var authHeader = Headers.GetAuthorizationHeader(uploadUser.Name, uploadUser.Password);
uploader.SetRequestHeader(authHeader.Key,authHeader.Value);
KeyValuePair<string, string> GetAuthorizationHeader(string username, string password)
{
return new KeyValuePair<string, string>(Authorization, "Basic " + EncodeToBase64(string.Format("{0}:{1}", username, password)));
}
string EncodeToBase64(string toEncode)
{
var bytes = Encoding.UTF8.GetBytes(toEncode);
var returnValue = Convert.ToBase64String(bytes);
return returnValue;
}
鉴于我的方案,这比通过密码保险箱管理凭据更容易
您只能有 20 个具有凭据的未完成操作。
如果您认为当时没有运行任何操作,则缓存中可能有 10 个被遗忘或损坏的操作。 AttachAsync()
所有这些并立即取消它们。
下面是一个示例:
private async Task CancelAll()
{
// Get all running operations.
var downloads = await BackgroundDownloader.GetCurrentDownloadsAsync();
Debug.WriteLine(downloads.Count);
var cancellationTokenSource = new CancellationTokenSource();
List<Task> tasks = new List<Task>();
foreach (var download in downloads)
{
var task = download.AttachAsync().AsTask(cancellationTokenSource.Token);
tasks.Add(task);
}
try
{
// Cancel all the operations. It is expected they will throw exception.
cancellationTokenSource.Cancel();
Task.WaitAll(tasks.ToArray());
}
catch (Exception ex)
{
Debug.WriteLine(ex);
}
Debug.WriteLine("All canceled!");
}
然后,使用 DownloadOperation.StartAsyn()
安排新操作。