我正在使用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;
}
答案 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;
}