【发布时间】:2018-04-28 09:46:48
【问题描述】:
我已经看到很多关于这个的问题,并且都指向我使用 ConfigureAwait(false),但是即使这样做了,它仍然没有返回任何响应。当我运行调试器时,代码在 PostAsync 处停止并且不会继续我的代码。我在这里做错了吗?和我通过 HTTPS 调用 API 有关吗?
代码如下:
public async static Task<PaymentModel> AddAsync(Card card)
{
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(string.Format("{0}:", "hidden"))));
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
var cardJson = JsonConvert.SerializeObject(card);
var postRequest = new StringContent(cardJson, Encoding.UTF8, "application/json");
var request = await client.PostAsync(new Uri("https://sample-3rd-party-api/api/endpoint/here"), postRequest).ConfigureAwait(false);
var content = await request.Content.ReadAsStringAsync().ConfigureAwait(false);
}
编辑:
为了响应下面的 cmets,代码包含在 AddAsync(Card card) 方法中,该方法通过使用处理程序的按钮单击调用:
public async void OnExecute(object sender, EventArgs args)
{
//some code here
payment = await PaymentModel.AddAsync(card).ConfigureAwait(false);
}
编辑 2: 我尝试 ping API,但它返回一个请求超时,但是当我使用 Postman 尝试它时,它做得很好(API 只是一个对所有人开放的沙盒,所以可以分享 this):
编辑 3:
我认为问题在于我没有 SSL 证书来访问 API。我有一个连接到同一个 API 的 PHP 服务器,我必须将 SSL_VERIFYPEER 设置为 false 才能访问它(别担心,我现在添加了一个 cacert,所以它再次为 true)。这里会发生同样的问题吗?如果是这样,我该怎么做才能为我的 xamarin 表单应用程序创建有效证书
【问题讨论】:
-
您在哪里以及如何称呼这一切?请告诉我们包含方法和调用它的位置。
-
HttpClient有一个Timeout属性,将其设置为一个较小的值并将您的代码包装在一个 try-catch 块中以查看是否有任何异常。 -
正如@FedericoDipuma 所说,您的问题(如果它是死锁)将与调用此代码的代码或调用该代码的代码等有关。您在某个地方阻塞了等待的同步上下文。 ConfigureAwait 不是为了避免死锁和it doesn't always save you 而创建的,因此您必须了解它的作用才能正确使用它。
-
@FedericoDipuma 嗨,我已经从最顶层的调用中添加了其他代码。我希望它能阐明可能导致问题的原因
-
尝试设置 Fiddler 以拦截该请求并通过 C# 再次发送请求。将您在此处捕获的内容与您在 Postman 中看到的有关请求的内容进行比较。如果它们完全相同,您就知道您的问题在于处理响应的 C# 方面。如果它们不同,您可以调整在 C# 中构建请求的方式。如果您根本看不到请求,它甚至不会被发送,您将在 C# 中查看其他内容。
标签: c# .net xamarin.forms async-await dotnet-httpclient