【问题标题】:Call Web API within MVC Program在 MVC 程序中调用 Web API
【发布时间】:2018-09-24 22:28:09
【问题描述】:

我创建了 Web API 来从 OpenWeatherAPI 接收每日温度。

现在我想在我的 MVC 网页上显示所有内容。我把API调用放在MVC项目中;计划稍后创建新项目以获得更好的微服务架构。

我在调试窗口和 MVC html 中看到了这些错误,如下所示。如何让天气、温度等降水量显示在 html 上。

Debug: weathercontroller.City("Seattle")    The function evaluation requires all threads to run.    System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>"

HTML: System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1+AsyncStateMachineBox`1[Microsoft.AspNetCore.Mvc.IActionResult,WeatherChecker.Controllers.WeatherController+<City>d__0]"

MVC 页面:

namespace WeatherPage.Controllers
{
    public class HomeController : Controller
    {

        public WeatherController weathercontroller = new WeatherController();

        public IActionResult Index()
        {
            return View();
        }

        public IActionResult About()
        {
            ViewData["Message"] = "Your application description page.";
            ViewData["test"] =  weathercontroller.City("Seattle");
            return View();
        }

API 控制器:

[Route("api/[controller]")] 
public class WeatherController : ControllerBase
{
    [HttpGet("[action]/{city}")]
    public async Task<IActionResult> City(string city)
    {

        Rootobject rawWeather = new Rootobject();
        using (var client = new HttpClient())
        {
            try
            {
                client.BaseAddress = new Uri("http://api.openweathermap.org");
                var response = await client.GetAsync($"/data/2.5/weather?q={city}&appid=APIkey&units=metric");
                response.EnsureSuccessStatusCode();

                var stringResult = await response.Content.ReadAsStringAsync();
                rawWeather = JsonConvert.DeserializeObject<Rootobject>(stringResult);
                return Ok(rawWeather);
            }
            catch (HttpRequestException httpRequestException)
            {
                return BadRequest($"Error getting weather from OpenWeather: {httpRequestException.Message}");
            }
        }
    }




public class Rootobject
{
    public Coord coord { get; set; }
    public Weather[] weather { get; set; }
    public string _base { get; set; }
    public Main main { get; set; }
    public int visibility { get; set; }
    public Wind wind { get; set; }
    public Clouds clouds { get; set; }
    public int dt { get; set; }
    public Sys sys { get; set; }
    public int id { get; set; }
    public string name { get; set; }
    public int cod { get; set; }
}

这适用于我的项目: https://localhost:55555/api/weather/city/washington

Retrieve Data From Third party Openweather Api

Should We Call Web Api from Mvc Application in Same Solution

【问题讨论】:

  • 不要在这个控制器中新建你的 API 控制器。使用 HttpClient 向 API 控制器公开的端点发出请求。
  • 嗨,克里斯,你能提交替代解决方案吗,我以为我已经在代码中使用了 Http 客户端,谢谢
  • 您在实际的WeatherController 中,但在您的HomeController 中,您只是尝试像WeatherController 实例上的方法一样简单地调用操作。您还需要在那里使用HttpClient。另外,不要直接更新HttpClient。它应该被视为单例。见:docs.microsoft.com/en-us/aspnet/core/fundamentals/…

标签: c# asp.net-core asp.net-core-mvc asp.net-core-webapi dotnet-httpclient


【解决方案1】:

您在调用 API 操作时缺少等待语句。

你的代码应该是这样的:

ViewData["test"] =  await weathercontroller.City("Seattle");
return View();

您需要将控制器更改为异步,以便它可以等待方法并被系统作为异步方法读取。您的代码应如下所示:

public async Task<IActionResult> About()
{
    ViewData["Message"] = "Your application description page.";
    ViewData["test"] = await weathercontroller.City("Seattle");
    return View();
}

【讨论】:

  • 你需要“一路异步”。 HomeController 中的 About 操作必须是 async: public async Task&lt;IActionResult&gt; About()
  • 这是因为您需要将控制器更改为异步,以便它可以等待方法并被系统作为异步方法读取。您的代码应如下所示:public async Task&lt;IActionResult&gt; About() { ViewData["Message"] = "Your application description page."; ViewData["test"] = weathercontroller.City("Seattle"); return View(); }
  • 谢谢,试过了,效果很好,给分,如果你也喜欢问题,请竖起大拇指
猜你喜欢
  • 2017-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-16
  • 2014-02-16
  • 2016-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多