Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步方法不返回字符串_C#_Asp.net_Api - Fatal编程技术网

C# 异步方法不返回字符串

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

我试图从开放的天气图中获取一些天气数据,并在C#中使用HTTPClient和API ASP.NET。 我的代码不断返回:

System.Threading.Tasks.Task`1[System.String]

我已经使我的方法
异步
等待
,但仍然返回了上面的方法。我想让它
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我添加了