3 回答

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超1個(gè)贊
控制器操作也需要異步,以避免混合異步等待和阻塞調(diào)用,例如.Result
或.Wait()
可能導(dǎo)致死鎖。
public class HomeController : Controller {? ??
? ? APIController webService = new APIController();
? ? public async Task<ActionResult> Index() {? ??
? ? ? ? var model = await webService.GetTeams();
? ? ? ? var teams = model.teams;
? ? ? ? return View();
? ? }
}
假設(shè)APIController是一個(gè)實(shí)際的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像這樣直接調(diào)用HomeController,而是將GetTeams()方法提取到可重用的服務(wù)中
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 錯(cuò)誤
可以正確地用于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);
? ? }
}
這里的假設(shè)是該項(xiàng)目是一個(gè)混合的 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貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超4個(gè)贊
是的,C# 中的等效方法是使用HttpClient
.?您最好創(chuàng)建一個(gè)類的靜態(tài)實(shí)例,以便為特定類型的重復(fù)調(diào)用重用:
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貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超10個(gè)贊
只是想在此處添加更多點(diǎn)您獲得的 json 無法直接轉(zhuǎn)換為 TeamStatsClass 您可能必須引入另一個(gè)基類,因?yàn)閳F(tuán)隊(duì)是您獲得的 json 中的集合。
我將其發(fā)布在這里以獲得更清晰的視圖
? ? 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 關(guān)注
- 194 瀏覽
添加回答
舉報(bào)