我的问题与这里的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/

10-13 07:08