C# 异步方法不返回字符串
我试图从开放的天气图中获取一些天气数据,并在C#中使用HTTPClient和API ASP.NET。 我的代码不断返回: System.Threading.Tasks.Task`1[System.String] 我已经使我的方法C# 异步方法不返回字符串,c#,asp.net,api,C#,Asp.net,Api,我试图从开放的天气图中获取一些天气数据,并在C#中使用HTTPClient和API ASP.NET。 我的代码不断返回: System.Threading.Tasks.Task`1[System.String] 我已经使我的方法异步和等待,但仍然返回了上面的方法。我想让它wait会返回值 我只是想从开放的天气图中获取字符串,一旦我有了这个功能,我会担心如何将其解析为JSON。这是我的代码,“my_APPID”被替换为我的API密钥,我刚刚在这里删除了它 我的主要意见是: private asyn
异步
和等待
,但仍然返回了上面的方法。我想让它wait
会返回值
我只是想从开放的天气图中获取字符串,一旦我有了这个功能,我会担心如何将其解析为JSON。这是我的代码,“my_APPID”被替换为我的API密钥,我刚刚在这里删除了它
我的主要意见是:
private async Task<string> GetLocationJson()
{
const string APPID = "(MY_APPID)";
const string LOCATIONID = "2172797";
string jsonAsString = "";
string callStringJson = "api.openweathermap.org/data/2.5/weather?id=" + LOCATIONID + "&appid=" + APPID;
ApiCalls weatherApi = new ApiCalls(callStringJson);
jsonAsString = await weatherApi.GetLocationJson();
return jsonAsString;
}
//ShowLocationJson is called on button click
protected void ShowLocationJson(object sender, EventArgs e)
{
litOutput.Text = GetLocationJson().ToString();
}
private异步任务GetLocationJson()
{
常量字符串APPID=“(我的APPID)”;
常量字符串LOCATIONID=“2172797”;
字符串jsonAsString=“”;
string callStringJson=“api.openweathermap.org/data/2.5/weather?id=“+LOCATIONID+”&appid=“+appid;
ApiCalls weatherApi=新的ApiCalls(callStringJson);
jsonAsString=await weatherApi.GetLocationJson();
返回jsonAsString;
}
//单击按钮时调用ShowLocationJson
受保护的void ShowLocationJson(对象发送方,事件参数e)
{
litOutput.Text=GetLocationJson().ToString();
}
我的课程是:
public class ApiCalls
{
HttpClient client = new HttpClient();
Uri url;
public ApiCalls(string link)
{
url = new Uri("https://" + link);
}
public async Task<string> GetLocationJson()
{
string content = await client.GetStringAsync(url);
return content;
}
}
公共类调用
{
HttpClient=新的HttpClient();
uriurl;
公共APICALL(字符串链接)
{
url=新Uri(“https://”+链接);
}
公共异步任务GetLocationJson()
{
string content=wait client.GetStringAsync(url);
返回内容;
}
}
url
变量被传递了正确的值,所以我知道在那里是可以的
我也在使用ASP.NET Framework 4.5,因为Steve和mason已经注意到,您必须等待所有方法返回任务。您需要将ShowLocationMethod更改为:
protected async void ShowLocationJson(object sender, EventArgs e)
{
litOutput.Text = await GetLocationJson();
}
您将收到
System.Threading.Tasks.Task1[System.String]
,因为您调用了Task对象的方法ToString()。该方法的默认实现返回对象类型的完全限定名:Task
您应该等待对GetLocationJson()的调用并删除ToString。此外,ShowLocationJson应该是异步的。您需要等待所有异步调用,包括对GetLocationJson的调用。任何调用该方法的地方都需要标记为async。事件处理程序可以标记为async并返回void,这是少数允许的位置之一。您好,我使用的是ASP.NET Framework 4.5。我已经做了你提到的更改,当我运行它时,我得到了一个滑稽的错误,因为链接到OnClick for my button的事件处理程序不再被识别(ShowLocationJson)@mason是的,然后当我使用ToString()
时,我返回到以文本形式显示为System.Threading.Tasks.Task1[System.String]的地方。当我不包含ToString()
时,我得到的错误无法隐式地将System.Threading.Tasks.Task类型转换为字符串。我想也许我想做一些我不应该做的事情,我应该把响应解析成json,并在页面加载时显示我想要的方式?@zolty13和@mason我添加了