如何使用 HttpClient 获取 post 数据? (一个比实际有效的答案)

How to post data using HttpClient? (an answer than actually works)

关于这个还有另一个问题,但它最后没有一个有效的解决方案,唯一好的答案,出于某种原因,不起作用,不适合问它的人,不适合我也是。

这个问题在这里:

给出相应的声明,这是我目前的代码:

方法调用与网络服务器连接的方法:

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"它returns某些json对象。

这个网络服务器已经正常工作了(我用一些插件测试了它,它工作正常)

此方法应该发送 "markString" 并接收回数据,这样我就可以在应用程序中使用它了。

我正在制作 Xamarin Android 应用程序。

还记得我根本没有任何连接问题,事实上,当我尝试使用网络客户端发送数据时,应用程序正在发送数据,但我希望它使用HttpClient.

问题

代码未返回任何内容。任何信息、澄清、问题、建设性评论或任何可以导致答案的请求也将不胜感激。

提前致谢。

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;
    }

}

大多数异步代码死锁情况都是由于 blocking further up the call stack

默认情况下 await 捕获 "context"(在本例中为 UI 上下文),并在该上下文中继续执行。因此,如果您在任务上调用 async 方法和块(例如,GetAwaiter().GetResult()Wait()Result),则 UI 线程是被阻止,这会阻止 async 方法恢复和完成。