3 回答

TA貢獻1852條經驗 獲得超1個贊
控制器操作也需要異步,以避免混合異步等待和阻塞調用,例如.Result
或.Wait()
可能導致死鎖。
public class HomeController : Controller {? ??
? ? APIController webService = new APIController();
? ? public async Task<ActionResult> Index() {? ??
? ? ? ? var model = await webService.GetTeams();
? ? ? ? var teams = model.teams;
? ? ? ? return View();
? ? }
}
假設APIController是一個實際的ApiContoller
public class APIController : ApiController {
? ? //Your original code
? ? public async Task<StatsTeamsClass> GetTeams() {? ? ? ??
? ? ? ? HttpClient Http = new HttpClient();
? ? ? ? var json = await Http.GetStringAsync("https://statsapi.web.nhl.com/api/v1/teams?sportId=1");
? ? ? ? StatsTeamsClass teams = JsonConvert.DeserializeObject<StatsTeamsClass>(json);
? ? ? ? return teams;
? ? }
? ? //...
}
我建議不要APIController像這樣直接調用HomeController,而是將GetTeams()方法提取到可重用的服務中
public class WebService {
? ? static Lazy<HttpClient> http = new Lazy<HttpClient>();
? ? public async Task<T> GetAsync<T>(string url) {? ? ? ??
? ? ? ? var json = await http.Value.GetStringAsync(url);
? ? ? ? return JsonConvert.DeserializeObject<T>(json);
? ? }
? ? public Task<StatsTeamsClass> GetTeamsAsync() {? ? ? ??
? ? ? ? var url = "https://statsapi.web.nhl.com/api/v1/teams?sportId=1";
? ? ? ? return GetAsync<StatsTeamsClass>(url);
? ? }
}
參考您使用 HttpClient 錯誤
可以正確地用于HomeController
public class HomeController : Controller {? ? ? ??
? ? public async Task<ActionResult> Index() {
? ? ? ? // Ideally web service should be injected but that topic
? ? ? ? // is outside of the scope of the question at the moment.
? ? ? ? var webService = new WebService();
? ? ? ? var model = await webService.GetTeamsAsync();
? ? ? ? var teams = model.teams;
? ? ? ? //...
? ? ? ? return View(teams);
? ? }
}
這里的假設是該項目是一個混合的 Asp.Net MVC 和 Web Api 2+
索引.cshtml
@model IEnumerable<Teams>
@{
? ? ViewBag.Title = "Teams";
}
@if(Model != null && Model.Count() > 0) {
? ? @foreach (var @team in Model) {
? ? ? ? <p>@team.name</p>
? ? }
}

TA貢獻1831條經驗 獲得超4個贊
是的,C# 中的等效方法是使用HttpClient
.?您最好創建一個類的靜態實例,以便為特定類型的重復調用重用:
private?static?readonly?HttpClient?Http?=?new?HttpClient();
然后通過async
使用Newtonsoft.Json 的方法使用它,如下所示:
var?json?=?await?Http.GetStringAsync("https://statsapi.web.nhl.com/api/v1/teams?sportId=1");
然后,您可以將此 JSON 字符串解析為模型類,如下所示:
var?model?=?JsonConvert.DeserializeObject<TeamStatsClass>(json);

TA貢獻1796條經驗 獲得超10個贊
只是想在此處添加更多點您獲得的 json 無法直接轉換為 TeamStatsClass 您可能必須引入另一個基類,因為團隊是您獲得的 json 中的集合。
我將其發布在這里以獲得更清晰的視圖
? ? public class ResponseBaseClass
? ? {
? ? ? ? public IEnumerable<TeamStatsClass> teams { get; set; }
? ? ? ? public string copyright { get; set; }
? ? }
? ? public class TeamStatsClass
? ? {
? ? ? ? public int id { get; set; }
? ? ? ? public string name { get; set; }
? ? ? ? public Division division { get; set; }
? ? }
? ? public class Division
? ? {
? ? ? ? public int id { get; set; }
? ? ? ? public string name { get; set; }
? ? ? ? public string nameShort { get; set; }
? ? ? ? public string link { get; set; }
? ? }
?HttpClient Http = new HttpClient();
?var json = await Http.GetStringAsync("https://statsapi.web.nhl.com/api/v1/teams?sportId=1");
?var model = JsonConvert.DeserializeObject<ResponseBaseClass>(json);
?var yourTeamModelObj = model.teams;
- 3 回答
- 0 關注
- 177 瀏覽
添加回答
舉報