PasswordCredential BackgroundTransfer

时间:2014-11-27 20:55:05

标签: c# .net windows-phone-8.1 credentials

我正在创建一个新的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,但它是空的,没有存储凭据。 我该怎么办?

2 个答案:

答案 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()安排新操作。