我正在创建一个新的BackgroundTransfer并添加服务器凭据:
PasswordCredential webdavLogin = new PasswordCredential();
webdavLogin.UserName = ServerSettings.Values["serverUsername"].ToString();
webdavLogin.Password = ServerSettings.Values["serverPassword"].ToString();
uploader.ServerCredential = webdavLogin;
现在的问题是,每次运行BackgroundTransfer时,都会引发以下异常:
Exception from HRESULT: 0x80070565
The maximum number of secrets that may be stored in a single system has been exceeded
我搜索了CredentialStore,但它是空的,没有存储凭据。 我该怎么办?
答案 0 :(得分:0)
我遇到了完全相同的问题。 BackgroundTransfer 显然是将它们添加到 PasswordVault 本身。您可以尝试不创建 PasswordCredential 的新实例,但要确保它位于 PasswordVault 中(如果不存在则添加)并检索它。这可能会停止 BackgroundTransfer 多次添加它。您仍然需要观看可以存储在手机上的最大凭证数量......我想到了一些像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;
}
根据我的情况,这比通过 PasswordVault
管理凭据更容易答案 1 :(得分:0)
您只能使用凭据进行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()
安排新操作。