【问题标题】:Asynchronously calling an external REST API from controller or view?从控制器或视图异步调用外部 REST API?
【发布时间】:2020-07-19 20:01:36
【问题描述】:

我一直在努力解决这个问题太久了。这是我第一次使用 C# 和 .NET,除了大约 15 年前涉足 C++ 之外,我没有任何编程经验。 REST API 和异步性对我来说是新概念。

我正在尝试在 .NET MVC 5 中创建一个记分板页面,该页面由一个简单的表组成,其中的行包含从 MySQL 数据库中检索到的值。 数据库表中的每一行代表一个独特的球员以及他的各种统计值。我创建了一个模型来代表每个玩家PlayerRow,并将List<PlayerRow> 传递给我的视图,在该视图中通过@foreach (PlayerRow playerrow in Model) 生成表格。

这是我目前的ActionResult PlayerList()

public class HomeController : Controller
{
    public ActionResult PlayerList()
    {
        List<PlayerRow> PlayerRows = new List<PlayerRow>();
        string constr = ConfigurationManager.AppSettings["MySQLConnStr"];
        using (MySqlConnection con = new MySqlConnection(constr))
        {
            string query = "SELECT * FROM `rankme`";
            using (MySqlCommand cmd = new MySqlCommand(query))
            {
                cmd.Connection = con;
                con.Open();
                using (MySqlDataReader rdr = cmd.ExecuteReader())
                {
                    while (rdr.Read())
                    {
                        PlayerRows.Add(new PlayerRow
                        {
                            TableID = rdr["id"].ToString(),
                            LegacySteamID = rdr["steam"].ToString(),
                            Steam64 = ConvertToSteam64(rdr["steam"].ToString()),
                            Name = rdr["name"].ToString(),
                            IP = rdr["lastip"].ToString(),
                            Score = Convert.ToInt32(rdr["score"]),
                            etc etc...
                        });
                    }
                }
                con.Close();
            }
        }

        return View(PlayerRows);
    }
}

相关内容来自我的PlayerList.cshtml

        @foreach (PlayerRow playerrow in Model)
        {
        <tr>
            <th scope="row" class="avatar" id="@playerrow.Steam64"><img src="~/Content/placeholder.png"</th>
            <td><a href="http://steamcommunity.com/profiles/@playerrow.Steam64">@playerrow.Name</a></td>
            <td>@playerrow.Score</td>
            <td>@playerrow.Kills</td>
            <td>@playerrow.Deaths</td>
            <td>@playerrow.Assists</td>
            etc etc...
        </tr>
    }

MySQL 连接工作得很好,并且表格按照我想要的方式显示。 (虽然还不够完善) Picture of my current table

接下来我想做的是将每个表格行中的占位符头像替换为通过 Steam API 检索到的玩家头像。每个玩家头像 url 都可以通过调用 https://api.steampowered.com/ISteamUser/GetPlayerSummaries/v2/?key=_API_KEY_&amp;steamids=_STEAMID64_ 来从 Steam API 中获取,这会返回一个 json 响应:

{
"response":{
  "players":[
     {
        "steamid":"EXAMPLE_STEAMID",
        "communityvisibilitystate":3,
        "profilestate":1,
        "personaname":"EXAMPLE_NAME",
        "commentpermission":1,
        "profileurl":"EXAMPLE_STEAM_PROFILE_URL",
        "avatar":"https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/EXAMPLE_AVATAR.jpg",
        "avatarmedium":"https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/81/EXAMPLE_AVATAR_medium.jpg",
        "avatarfull":"https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/EXAMPLE_AVATAR_full.jpg",
        "lastlogoff":1586222967,
        "personastate":0,
        "realname":"EXAMPLE_REALNAME",
        "primaryclanid":"103582",
        "timecreated":1070200624,
        "personastateflags":0,
        "loccountrycode":"US"
     }
  ]

所以我想这需要我使用HttpClient() 发出请求并等待响应。这就是我迷路的地方,因为我似乎无法等待异步方法之外的响应。也许使用 AJAX(我从未使用过)会更合适?

我可以创建一个异步方法来使用 Steam API 吗?应该何时以及从何处调用该方法?

【问题讨论】:

    标签: c# ajax asp.net-mvc async-await steam-web-api


    【解决方案1】:

    要从控制器调用异步方法,您只需将签名更改为

    public async Task&lt;IActionResult&gt; PlayerList(CancellationToken cancellationToken)

    从这里,您将能够调用任何您喜欢的async 方法。

    我不太了解 Steam API,所以如果您要进行大量网络调用,最好在浏览器/Javascript 端执行此操作(在浏览器滚动到视图时延迟加载头像)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-02
      • 1970-01-01
      • 2017-05-06
      • 1970-01-01
      • 2017-05-19
      • 2022-12-05
      • 1970-01-01
      • 2014-05-06
      相关资源
      最近更新 更多