【问题标题】:Reading the response from HttpClient.GetStringAsync从 HttpClient.GetStringAsync 读取响应
【发布时间】:2015-02-14 16:58:23
【问题描述】:

我正在使用 Windows Phone/Store 应用程序的新运行时开发一个 Windows 通用应用程序。我正在使用以下代码向服务器发送请求,并期望得到 HTML 响应。但是,当我返回字符串并在 UI 中显示它时,它只是说:

“System.Threading.Tasks.Task'1[System.String]”

它没有显示应该返回的实际 HTML/XML。当我在普通的 Windows 窗体应用程序中使用相同的 URL 时,它会返回我期望的数据,但我使用的代码不同,因为它是 Win32 而不是 WinRT/这个新 RT。

这是我的代码。我怀疑我没有以正确的格式或其他方式返回数据,但我不知道我应该做什么。

var url = new Uri("http://www.thewebsitehere.com/callingstuff/calltotheserveretc");
var httpClient = new HttpClient();

        try
        {
            var result = await httpClient.GetStringAsync(url);
            string checkResult = result.ToString();
            httpClient.Dispose();
            return checkResult;
        }
        catch (Exception ex)
        {
            string checkResult = "Error " + ex.ToString();
            httpClient.Dispose();
            return checkResult;
        }

【问题讨论】:

  • 是的,确实返回了Task<string>。你应该对它的 Result 属性更感兴趣。
  • 如果您要处置客户端,然后在 using(){} 块中执行此操作。但是HttpClient is different,使用单例。

标签: c# windows-runtime windows-phone-8.1 win-universal-app


【解决方案1】:

我认为问题不在于这段代码 sn-p,而在于调用者。我怀疑此代码在返回 Task 的方法中(正确,以便调用者可以等待此方法的 HttpClient 调用工作)但调用者没有等待它。

代码 sn-p 看起来是正确的,并且与 https://msdn.microsoft.com/en-us/library/windows/apps/windows.web.http.httpclient.aspx 的文档中的代码基本相同。 GetStringAsync 返回一个任务。 await 将处理 Task 部分并将一个字符串返回到 var 结果中。如果您在函数内部中断并检查结果或 checkResult,它们将是所需的字符串。

调用者也需要发生同样的事情。如果这是在一个函数中

Task<string> GetData() 
{
    // your code snippet from the post 
    return checkResult; // string return is mapped into the Task<string>
}

然后需要调用await来获取字符串而不是任务,并等待GetData的内部await完成:

var v = GetData(); // wrong <= var will be type Task<string>
var data = await GetData(); // right <= var will be type string

您不会等待任务的唯一情况是您需要操纵任务本身而不仅仅是获取结果。

【讨论】:

  • 实际上这是两个答案的组合。我需要查看 Results 属性,并且还必须使用 await 来调用该方法。
【解决方案2】:

“await”运算符只能在异步方法中使用。将其返回类型更改为Task&lt;string&gt; 应该可以解决问题。 try 块应该是这样的:

try
    {
        Task<string> t = httpClient.GetStringAsync(url);
        string checkResult = t.Result;
        httpClient.Dispose();
        return checkResult;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 2013-09-09
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    相关资源
    最近更新 更多