从HttpClient.GetStringAsync读取响应

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

"System.Threading.Tasks.Task'1[System.String]"

它没有显示应该返回的实际HTML/XML。当我在普通的Windows Forms应用程序中使用相同的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属性。 - Hans Passant
如果你要Dispose客户端,那么请在using(){}块中进行。但是HttpClient不同,请使用单例模式。 - H H
2个回答

12

我认为问题不在这段代码片段中,而是在调用方。我怀疑这段代码是在一个返回Task的方法中(以便调用方可以等待此方法的HttpClient调用完成),但调用方没有等待它。

这段代码片段看起来正确,基本上与文档中的https://msdn.microsoft.com/zh-cn/library/windows/apps/windows.web.http.httpclient.aspx相同。GetStringAsync返回一个Task。等待操作将处理Task部分,并将字符串返回到变量result中。如果在函数内部中断并检查result或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。 - irldev

0
“await” 操作符只能在异步方法中使用。将其返回类型更改为 Task<string> 应该可以解决问题。try 块应该像这样:
try
    {
        Task<string> t = httpClient.GetStringAsync(url);
        string checkResult = t.Result;
        httpClient.Dispose();
        return checkResult;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接