从HttpClient.GetStringAsync读取响应

时间:2015-02-14 16:58:23

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

我正在使用Windows Phone / Store应用程序的新运行时使用Windows Universal应用程序。我正在使用以下代码向服务器发送请求并期望返回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;
        }

2 个答案:

答案 0 :(得分:8)

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

代码段看起来正确且与https://msdn.microsoft.com/en-us/library/windows/apps/windows.web.http.httpclient.aspx中的文档基本相同。 GetStringAsync返回一个Task。 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的内部等待完成:

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

如果您需要操作任务本身而不仅仅是获得结果,那么您唯一不会等待任务的时间就是。

答案 1 :(得分:0)

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

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