HttpClient PostAsync不会返回

时间:2018-04-28 09:46:48

标签: c# .net xamarin.forms async-await dotnet-httpclient

我已经看到了很多关于这个的问题,所有人都指向我使用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): enter image description here

enter image description here

编辑3:

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

4 个答案:

答案 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 +)