12

我已经看到了很多关于这个的问题,并且都指向我使用 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(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 只是一个对所有人开放的沙盒,所以可以分享这个): 在此处输入图像描述

在此处输入图像描述

编辑 3:

我认为问题在于我没有 SSL 证书来访问 API。我有一个连接到同一个 API 的 PHP 服务器,我必须将 SSL_VERIFYPEER 设置为 false 才能访问它(别担心,我现在添加了一个 cacert,所以它再次为 true)。这里会发生同样的问题吗?如果是这样,我该怎么做才能为我的 xamarin 表单应用程序创建有效证书

4

4 回答 4

3

你可以用这个

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());
}
于 2018-05-21T03:15:03.680 回答
1

这里最有可能发生的是您的OnExecute方法有一个返回类型,void而不是Task阻止 UI 线程能够等待它。尝试将返回类型更改为Task或创建新的 UI 线程来执行此工作。只要 Postman 工作,我就不会担心 ping 超时。许多公共 Web 服务器禁用它们的 ping 响应。

于 2018-05-17T04:53:36.293 回答
0

所以我认为问题现在已经解决,因为我能够从请求中接收内容,我所做的只是按照这里的文档:https ://docs.microsoft.com/en-us/xamarin/cross-platform/应用程序基础/传输层安全性?tabs=windows

看起来我的设置在平台级别已经过时了。

更新 HttpClient 实现和 SSL/TLS 实现选项以启用 TLS 1.2 安全性。

更新 HttpClient 实现选项以启用 TSL 1.2 安全性。(NSUrlSession (iOS 7.0+)

于 2018-11-16T12:57:57.383 回答
0

这与我通过 HTTPS 调用 API 有关吗?

由于您仍在同一个网络中并从 POSTMAN 和 .NET HTTP 客户端调用相同的 API,并且只能通过 POSTMAN 获得成功。所以这个问题被取消了。下一个

尝试 ping API,但它返回请求超时

这是在我的上面回答的。

您能否在初始化时尝试为 HTTPClient 设置超时选项。

client.Timeout = TimeSpan.FromSeconds(10);

如果问题仍然存在,请设置 Fiddler 并比较从 POstman 和 .NET 客户端发送的请求

于 2018-05-20T19:58:25.850 回答