我已经看到了很多关于这个的问题,所有人都指向我使用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);
}
编辑:
在回复下面的评论时,代码包含在一个方法AddAsync(卡片卡)中,该方法是通过一个带有处理程序的按钮点击调用的:
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表单应用程序创建有效的证书
答案 0 :(得分:2)
您可以使用此
var json = JsonConvert.SerializeObject(card);
using (var client = new HttpClient())
{
var t = await client.PostAsJsonAsync("https://sample-3rd-party-api/api/endpoint/here", json);
Response R =JsonConvert.DeserializeObject<Response>((JsonConvert.DeserializeObject(t.Content.ReadAsStringAsync().Result.ToString())).ToString());
}
答案 1 :(得分:1)
这里最有可能发生的是OnExecute
方法的返回类型为void
而不是Task
,这会阻止UI线程等待它。尝试将返回类型更改为Task
或创建新的UI线程以执行此工作。只要Postman工作,我就不会担心ping超时。许多公共Web服务器禁用其ping响应。
答案 2 :(得分:0)
是否与我通过HTTPS调用API有关?
当您保持在同一网络中并从POSTMAN和.NET HTTP客户端调用相同的API时,只能通过POSTMAN获得成功。因此,此问题将被取消。 下一步
尝试ping该API,但它返回一个请求超时
这是我的最佳答案。
您可以在初始化时尝试设置HTTPClient的超时选项。
<input type="button" title="Details" value="Details" onclick="location.href=
'@Url.Action("YourAction", "YourController", new { id = item.ID })'" />
如果问题仍然存在,请设置Fiddler并比较POstman和.NET客户端发送的req
答案 3 :(得分:0)
所以我认为问题已经解决,因为我能够从请求中接收内容,我所做的只是遵循这里的文档:https://docs.microsoft.com/en-us/xamarin/cross-platform/app-fundamentals/transport-layer-security?tabs=windows
在平台级别上,我的设置似乎已过时。
更新HttpClient实现和SSL / TLS实现 启用TLS 1.2安全性的选项。
更新HttpClient实施选项以启用TSL 1.2 安全。 (NSUrlSession(iOS 7.0 +)