调用API的类库在特定项目中不起作用

时间:2019-10-15 10:32:40

标签: c# asp.net-mvc asp.net-web-api

我有一个用于与日志API服务器通信的类库,方法“ chain”是这样的:

入口点->

 private static bool SendChecksumToServer(Checksum checksum)
    {
        var res = _api.GetAsync($"Checksum?assemblyName={checksum.CurrentAssembly}&checkSum={checksum.LogFileChecksum}&fileName={checksum.FileName}");
        return _api.Deserialize<bool>(res.Result.Content.ReadAsStringAsync().Result);
    }

这叫什么:

public async Task<HttpResponseMessage> GetAsync(string apiCall)
    {
        ApiGet get = new ApiGet();
        return await get.GetAsync(apiCall, client);
    }

这叫什么:

 public async Task<HttpResponseMessage> GetAsync(string apiCall, HttpClient client)
    {
        var response = await client.GetAsync(apiCall);
        return response;
    }

当我在控制台应用程序中使用类库时,此方法完全可以正常工作,但是一旦将其移至实际应用程序(MVC)后,它便停止工作,甚至根本无法执行控制器操作,尝试了所有我能想到的方法,例如检查防火墙,确保异步是正确的(尽管我确信这仍然不是因为api没有响应冻结了应用程序,但我无法再冒泡异步了)

1 个答案:

答案 0 :(得分:0)

很可能由于.Result阻止呼叫而导致死锁。

  

不要混合使用阻止代码和异步代码

引用Async/Await - Best Practices in Asynchronous Programming

完全重构代码

private static async Task<bool> SendChecksumToServer(Checksum checksum) {
    var res = await _api.GetAsync($"Checksum?assemblyName={checksum.CurrentAssembly}&checkSum={checksum.LogFileChecksum}&fileName={checksum.FileName}");
    String data = await res.Result.Content.ReadAsStringAsync();
    return _api.Deserialize<bool>(data);
}

确保正在调用的SendChecksumToServer也正在等待任务,

,如果不需要等待,也不会在其他调用中使用async-await

public Task<HttpResponseMessage> GetAsync(string apiCall) {
    ApiGet get = new ApiGet();
    return get.GetAsync(apiCall, client);
}

ApiGet

public Task<HttpResponseMessage> GetAsync(string apiCall, HttpClient client) {
    return client.GetAsync(apiCall);
}