如何使用 HttpClient 发布数据? (一个比实际有效的答案)
Posted
技术标签:
【中文标题】如何使用 HttpClient 发布数据? (一个比实际有效的答案)【英文标题】:How to post data using HttpClient? (an answer than actually works) 【发布时间】:2017-03-30 13:55:15 【问题描述】:关于这个还有另一个问题,但它最终没有一个有效的解决方案,唯一的好答案,出于某种原因,不起作用,不适用于提出问题的人,也不适用于我.
这样的问题在这里: How to post data using HttpClient?
鉴于相应的声明,这是我到目前为止的代码:
调用与网络服务器连接的方法的方法:
private void Button_Click(object sender, System.EventArgs e)
//. . . DO SOMETHING . . .
PopulateListView();
//. . . DO SOMETHING ELSE . . .
private void PopulateListView()
//. . . DO SOMETHING . . .
list = await "http://web.server.url".GetRequest<List<User>>();
//. . . DO SOMETHING ELSE . . .
连接网络服务器的方法:
public async static Task<T> SendGetRequest<T>(this string url)
try
var uri = new Uri(url);
HttpClient client = new HttpClient();
//Preparing to have something to read
var formContent = new FormUrlEncodedContent(new[]
new KeyValuePair<string, string>("OperationType", "eaf7d94356e7fd39935547f6f15e1c4c234245e4")
);
HttpResponseMessage response = await client.PostAsync(uri, formContent);
#region - - Envio anterior (NO FUNCIONO, SIN USO) - -
//var stringContent = new StringContent("markString");
//var sending = await client.PostAsync(url, stringContent);
//MainActivity.ConsoleData = await client.PostAsync(url, stringContent);
#endregion
//Reading data
//var response = await client.GetAsync(url);
var json = await response.Content.ReadAsStringAsync();
MainActivity.ConsoleData = json.ToString();
return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(json);
catch(Exception ex)
Console.WriteLine("Error: "+ex.ToString());
return default(T);
您可能猜到了,但我正在尝试创建一种方法,将称为“markString”的一些数据(通过 POST)发送到网络服务器而不是接收它,并且根据“markString”它返回某些 json 对象.
这个网络服务器已经正常工作了(我用一些插件对其进行了测试,它应该可以正常工作)
此方法应该发送“markString”并接收回数据,以便我可以在应用程序中使用它。
我正在制作一个 Xamarin android 应用程序。
另外请记住,我根本没有任何连接问题,事实上,当我尝试使用 Web 客户端发送数据时,该应用程序正在发送数据,但我希望它使用 @987654325 发送它@。
问题
代码没有返回任何内容。任何要求提供信息、澄清、问题、建设性的 cmets 或任何可能导致答案的请求也将不胜感激。
提前致谢。
【问题讨论】:
请确保您不是 blocking on async code 在调用堆栈中的更高级。 男孩,¡你在哪里对!这是一个僵局问题,如果你将它转换为答案,我会给你正确的答案,这比两者都重要,我的发布的代码和那里的人的代码有效,但这并不是真正的问题,非常感谢。 还提供一个代码,说明您如何使用该方法。旁注:奇怪的是有一个名为 SendGetRequest 的方法来发送帖子请求:) @Evk 这是一个公平的请愿,我现在就足够了。 @Evk 是的,这是一个陈旧的名字,但我想我喜欢活到极限;)(更不用说把“GetDataAsync”这个名字放在天上。 ) 【参考方案1】:大多数异步代码的死锁情况是由于blocking further up the call stack。
默认情况下,await
捕获“上下文”(在本例中为 UI 上下文),并在该上下文中继续执行。因此,如果您调用 async
方法和任务上的块(例如,GetAwaiter().GetResult()
、Wait()
或 Result
),则 UI 线程被阻塞,这会阻止 async
方法恢复和完成。
【讨论】:
【参考方案2】:void Main()
var test = SendGetRequest("http://www.google.com");
test.Dump();
public async static Task<string> SendGetRequest(string url)
try
var uri = new Uri(url);
HttpClient client = new HttpClient();
//Preparing to have something to read
var formContent = new FormUrlEncodedContent(new[]
new KeyValuePair<string, string>("OperationType", "eaf7d94356e7fd39935547f6f15e1c4c234245e4")
);
HttpResponseMessage response = await client.PostAsync(uri, formContent);
#region - - Envio anterior (NO FUNCIONO, SIN USO) - -
//var stringContent = new StringContent("markString");
//var sending = await client.PostAsync(url, stringContent);
//MainActivity.ConsoleData = await client.PostAsync(url, stringContent);
#endregion
//Reading data
//var response = await client.GetAsync(url);
var json = await response.Content.ReadAsStringAsync();
return json;
catch (System.Exception ex)
Console.WriteLine("Error: " + ex.ToString());
return string.Empty;
【讨论】:
不,也不行,无论如何它都会返回null,谢谢你的尝试以上是关于如何使用 HttpClient 发布数据? (一个比实际有效的答案)的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 HttpClient 发布数据? (一个比实际有效的答案)