使用async/await,您需要使其始终异步。
使服务成为基于任务的异步服务
[ServiceContract]
public interface IService1 {
[OperationContract]
Task<string> GetData();
}
因此,只需使其余代码始终异步即可。
public class http {
public async Task<string> HttpRequestAsync() {
var request = GetHttpRequestMessage();
string str1 = await ExecuteRequest(request);
Console.WriteLine(str1);
return str1;
}
//...code removed for brevity as they are already Task-based
}
这现在应该允许在服务实现中使用该功能
public class Service1 : IService1 {
public Task<string> GetData() {
http test = new http();
return test.HttpRequestAsync();
}
}
在提供的原始示例中,代码混合了异步调用和阻塞调用
.Result
,这可能导致死锁
参考
Async/Await - Best Practices in Asynchronous Programming
我还建议
HttpClient
静态并重用它,而不是创建多个实例并对其进行处理。
参考
keep an instance of HttpClient for the lifetime of your application
for each distinct API that you connect to.
更新时间:
另一种可能是调用的URL是HTTPS。
在通过
HttpClient
//Handle TLS protocols
System.Net.ServicePointManager.SecurityProtocol =
System.Net.SecurityProtocolType.Tls
| System.Net.SecurityProtocolType.Tls11
| System.Net.SecurityProtocolType.Tls12;