从Web方法中调用异步方法并获得返回

时间:2014-10-20 15:21:46

标签: c# asp.net asynchronous async-await webmethod

我在将一段工作代码移动到Web方法时遇到了困难。我正在使用SteamAPI和异步方法RunAsync(),当它全部在代码隐藏中处理时,它们之前都在工作。

但是我想把这个动作转移到一个Web方法,由JQuery .AJAX()处理。我基本上是在Web方法中调用该方法,并希望将数据恢复为由JQuery处理/表示。我以前处理过很多Web方法,但没有调用非静态方法和异步方法。

我实际上并没有收到错误,但是当调用API时,它只是坐在那里,我可以看到它在fiddler中请求数据(并返回它),但它从未从那一点开始,就好像它一样没有收到'继续我有我的数据'命令。最终我的.ajax电话会在30秒后响起。

谁能明白为什么?我放置了一些断点,但它永远不会从

移动
string res = await client.GetStringAsync("IPlayerService/GetOwnedGames/v0001/?key=my_steam_key&steamid=my_steam_id&include_appinfo=1&include_played_free_games=1&format=json");

即使在小提琴演出之后也有回应。

请参阅代码和截图。

    [System.Web.Services.WebMethod]
    public static async Task<string> Find_Games(string user)
    {
        string rVal = string.Empty;
        dynamic user_game_data;

        try
        {
            var thisPage = new _default();
            user_game_data = await thisPage.RunAsync();

            return user_game_data;
        }
        catch (Exception err)
        {
            throw new Exception(err.Message);
        }

    }


    public async Task<string> RunAsync()
    {
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri("http://api.steampowered.com/");
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            //client.Timeout = System.TimeSpan.FromMilliseconds(15000); //15 Secs

            try
            {
                string res = await client.GetStringAsync("IPlayerService/GetOwnedGames/v0001/?key=my_steam_key&steamid=my_steam_id&include_appinfo=1&include_played_free_games=1&format=json");

                // Read & Deserialize data
                //dynamic json_data = JsonConvert.DeserializeObject(res);
                ////int gamecount = json_data.response.game_count;
                //await saveOwnedGames(json_data, gamecount);
                return res;
            }
            catch (HttpRequestException e)
            {
                throw new Exception(e.Message);
            }

        }
    }

Fiddler Response, which i can examine the returned json data

提前致谢,如果您需要更多信息,请与我们联系。

1 个答案:

答案 0 :(得分:0)

您可以在没有异步内容的情况下完成此操作。

尝试WebClient

[System.Web.Services.WebMethod]
public static string Find_Games(string user)
{
    using (var client = new System.Net.WebClient())
    {
        return client.DownloadString(String.Concat("http://api.steampowered.com/", "IPlayerService/GetOwnedGames/v0001/?key=my_steam_key&steamid=my_steam_id&include_appinfo=1&include_played_free_games=1&format=json"));
    }
}