我正在使用以下方法从ASP网络服务器获取令牌。
public async static Task<bool> GetToken(string username, string password)
{
var token = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("username", username),
new KeyValuePair<string, string>("password", password),
new KeyValuePair<string, string>("grant_type", "password")
});
using (var client = new HttpClient())
{
client.Timeout = TimeSpan.FromMilliseconds(20000);
var response = await client.PostAsync(ServerTokenString, token);
if (response.IsSuccessStatusCode)
{
string content = await response.Content.ReadAsStringAsync();
var tokens = content.Split('"');
AccessToken = tokens[3];
TokenType = tokens[7];
return true;
}
return false;
}
}
然后我将令牌和令牌类型保存在字符串中。 然后,我使用此令牌进行请求。 但是,如果令牌将过期怎么办?我需要重新发送用户名和密码吗?或者,如果客户已经登录并且其令牌已过期,还有更简便的方法吗?
答案 0 :(得分:0)
在C#中,一个函数可以具有多个“风味”-根据发送的参数的类型和数量,它将调用“具有该风味”。在查看PostAsync
的文档时,我们可以看到以下“风味”。 (https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclient.postasync?view=netframework-4.7.2)
PostAsync(Uri, HttpContent, CancellationToken)
发送带有取消令牌的POST请求作为异步操作。
PostAsync(String, HttpContent, CancellationToken)
发送带有取消令牌的POST请求作为异步操作。
PostAsync(String, HttpContent)
通过异步操作将POST请求发送到指定的Uri。
PostAsync(Uri, HttpContent)
通过异步操作将POST请求发送到指定的Uri。
如果仔细查看这些内容,我们可以看到前两个参数具有3个参数,并且两个参数中的第三个参数均名为“ CancellationToken”。 (您可以阅读文档的其余部分以了解它们的作用。)
接下来的两个有2个没有令牌的参数。
在通话中,您将传递给以下变量
var response = await client.PostAsync(ServerTokenString, token);
由于要传递两个参数,因此您将在上面的列表中调用第3版或第4版。这意味着它们不是令牌-(即使名称中带有“令牌”)。
您可以这样更改代码: (改编自https://docs.microsoft.com/en-us/dotnet/api/system.threading.cancellationtoken?view=netframework-4.7.2)
// Define the cancellation token.
CancellationTokenSource source = new CancellationTokenSource();
CancellationToken CToken = source.Token;
var response = await client.PostAsync(ServerTokenString, token, CToken);
但是,这没有用。由于您正在使用await
,因此PostAsync将在没有时间使用CancellationToken之前完成。
仅当进程在另一个线程上运行时才使用CancellationToken -使用await等待线程完成,因此您从不不需要它。