Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# HttpClient PostAsync不返回_C#_.net_Xamarin.forms_Async Await_Dotnet Httpclient - Fatal编程技术网

C# HttpClient PostAsync不返回

C# HttpClient PostAsync不返回,c#,.net,xamarin.forms,async-await,dotnet-httpclient,C#,.net,Xamarin.forms,Async Await,Dotnet Httpclient,我已经看到了很多关于这方面的问题,所有这些都指向我使用ConfigureWait(false),但即使这样做了,它仍然没有返回任何响应。当我运行调试器时,代码在PostAsync处停止,不会继续使用我的代码。我做错什么了吗?这与我通过HTTPS调用API有关吗 代码如下: public async static Task<PaymentModel> AddAsync(Card card) { HttpClient client = new HttpClient();

我已经看到了很多关于这方面的问题,所有这些都指向我使用ConfigureWait(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);
}
编辑2: 我尝试Ping API,但它返回的请求超时,但当我尝试使用Postman时,它做得很好(API只是一个对所有人开放的沙箱,所以可以共享):

编辑3:


我认为问题在于我没有SSL证书来访问API。我有一个连接到同一API的PHP服务器,我必须将SSL_VERIFYPEER设置为false,这样我才能访问它(别担心,我现在添加了一个cacert,所以它再次为true)。同样的问题会在这里发生吗?如果是这样,我可以如何为我的xamarin forms应用程序创建有效证书这里最可能发生的是您的
OnExecute
方法的返回类型为
void
,而不是
Task
,这会阻止UI线程等待它。尝试将该返回类型更改为
Task
,或者创建一个新的UI线程来执行此工作。只要邮递员工作,我就不会担心ping超时。许多公共web服务器禁用其ping响应

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

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

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

这是我的回答

请在初始化时尝试设置HTTPClient的超时选项

client.Timeout = TimeSpan.FromSeconds(10);
如果问题仍然存在,请设置Fiddler并比较从POstman和.NET客户端发送的请求,您可以使用此

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());
}
var json=JsonConvert.serialized对象(卡片);
使用(var client=new HttpClient())
{
var t=wait client.PostAsJsonAsync(“https://sample-3rd-party-api/api/endpoint/here“,json);
响应R=JsonConvert.DeserializeObject((JsonConvert.DeserializeObject(t.Content.ReadAsStringAsync().Result.ToString()).ToString());
}

所以我认为问题现在已经解决了,因为我能够从请求中接收内容,我所做的只是按照这里的文档进行操作:

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

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

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


您在何处以及如何调用所有这些内容?请向我们显示包含方法以及调用它的位置。
HttpClient
有一个
Timeout
属性,将其设置为一个小值,并将您的代码包装在try-catch块中,以查看是否有异常。正如@FedericoDipuma所指出的,您的问题(如果是死锁)将使用调用此代码的代码,或调用该代码的代码,等等。您正在阻止等待的同步上下文。创建ConfigureWait不是为了避免死锁,因此您必须了解它如何正确使用它。@FedericoDipuma hi,我已从最顶端的调用添加了其他代码。我希望它能有所帮助什么可能导致issueTry设置Fiddler拦截该请求并通过C#再次发送该请求。将您在那里捕获的内容与您在Postman中看到的请求进行比较。如果它们完全相同,您知道您的问题在处理响应的C#端。如果它们不同,您可以调整构建r的方式C#中的equest。如果您根本看不到请求,它甚至没有被发送,您将在C#中查看其他内容。但我的OneExecute方法是一个按钮事件处理程序(根据文档,void适用于事件处理程序)。通过将类型更改为Task,它还能工作吗?另外,我在azure站点上设置了一个API,它的响应很好。不要丢弃HttpClient,因为它是为重复使用而设计的。这里有一些更多信息:HttpClient没有“PostAsJsonAsync”。嗨,我想问题在于我没有SSL证书来访问我有一个连接到同一个API的PHP服务器,我必须将SSL_VERIFYPEER设置为false,这样我才能访问它(别担心,我现在添加了一个cacert,所以它再次为true)。这里会发生同样的问题吗?如果会,我该怎么做才能为我的xamarin forms应用程序创建有效的证书?好吧,我已经与IIS合作过,在那里我们可以创建自签名证书。我确信这也是PHP server的一项规定。
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());
}