我的问题与这里的question非常相似。我有一个AuthenticationService
类,可以生成HttpClient
PostAsync()
,并且从ASP项目运行时从不返回结果,但是当我在Console应用程序中实现它时,它就可以正常工作。
这是我的身份验证服务类:
public class AuthenticationService : BaseService
{
public async Task<Token> Authenticate (User user, string url)
{
string json = JsonConvert.SerializeObject(user);
StringContent content = new StringContent(json, Encoding.UTF8, "application/json");
HttpResponseMessage response = await _client.PostAsync(url, content);
string responseContent = await response.Content.ReadAsStringAsync();
Token token = JsonConvert.DeserializeObject<Token>(responseContent);
return token;
}
}
它卡在这里:
HttpResponseMessage response = await _client.PostAsync(url, content);
这是我的 Controller 调用该服务:
public ActionResult Signin(User user)
{
// no token needed to be send - we are requesting one
Token token = _authenticationService.Authenticate(user, ApiUrls.Signin).Result;
return View();
}
这是我如何使用控制台应用程序测试服务的示例,它运行正常。
class Program
{
static void Main()
{
AuthenticationService auth = new AuthenticationService();
User u = new User()
{
email = "[email protected]",
password = "password123"
};
Token newToken = auth.Authenticate(u, ApiUrls.Signin).Result;
Console.Write("Content: " + newToken.user._id);
Console.Read();
}
}
最佳答案
由于您使用的是.Result
,因此最终将导致代码中的死锁。之所以在控制台应用程序中运行,是因为控制台应用程序没有上下文,但是ASP.NET应用程序有上下文(请参阅Stephen Cleary's Don't Block on Async Code)。您应该在 Controller Signin
中创建async
方法,然后对await
进行_authenticationService.Authenticate
调用,以解决死锁问题。
关于c# - HttpClient PostAsync()从不返回响应,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34078296/