【问题标题】:How to get body content in a http client call?如何在 http 客户端调用中获取正文内容?
【发布时间】:2022-11-13 13:21:25
【问题描述】:

我无法在此 http 客户端调用中获取正文内容,因为我无法弄清楚如何在此异步方法中获取请求的实际内容。

这是异步方法:

public async Task<HttpResponseMessage> AuthenticateUser(string username, string password)
        {
            var client = new HttpClient();
            var requestUri = new Uri($"{_authorityBaseUrl}/{_tenantID}/oauth2/token");
            var authenticationBody = CreatePasswordGrantConsent(username,password);
            return await client.PostAsync(requestUri, authenticationBody);
        }

这是我想从中获取正文内容的方法

protected void loginBtn_Click(object sender, EventArgs e)
    {
         AADConnector connector = new AADConnector();
         var result = connector.AuthenticateUser("username", "password").Result.Content;
    }

我尝试在 AuthenticateUser 方法中更改为:

public async Task<string>(string username , string password)
{
...
...
var response = await client.PostAsync(requestUri, authenticationBody);
var contents = await response.Content.ReadAsStringAsync();

return contents;
}

并将 loginBtn_Click 更改为:

AADConnector connector = new AADConnector();
Task<string> result = connector.AuthenticateUser("username","password");
var finalResult = result.Result;

但它只是死锁它会一直运行下去。

你们能解释一下为什么会这样吗?

【问题讨论】:

  • 使 loginBtn_Click 处理程序异步和 var finalResult = await connector.AuthenticateUser("username","password"); -- 您应该将 HttpClient 对象声明并初始化为静态字段(static Lazy&lt;HttpClient&gt; 更好,但初始化有很大不同)

标签: c# asynchronous


【解决方案1】:

这是我的做法:

public async Task<string> AuthenticateUser(string username, string password)
{
    var client = new HttpClient();
    var requestUri = new Uri($"{_authorityBaseUrl}/{_tenantID}/oauth2/token");
    var authenticationBody = CreatePasswordGrantConsent(username, password);
    var response = await client.PostAsync(requestUri, authenticationBody);
    var result = await response.Content.ReadAsStringAsync();

    return result;
}
AADConnector connector = new AADConnector();
var result = Task.Run(async () => await connector.AuthenticateUser("username", "password"));

try {
  result.Wait();
} catch {

}

dynamic data = JObject.Parse(result.Result);
string token = (string)data.access_token;

【讨论】:

    猜你喜欢
    • 2011-09-16
    • 2011-11-16
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 2016-03-10
    • 1970-01-01
    相关资源
    最近更新 更多