ASP.NET MVC 4应用程序如何调用远程WebAPI?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (218)

过去我创建了几个ASP.NET MVC应用程序,但我从未使用过WebAPI。我想知道如何创建一个简单的MVC 4应用程序,通过WebAPI而不是通过普通的MVC控制器来执行简单的CRUD操作。诀窍是WebAPI应该是一个单独的解决方案(事实上,它可能在不同的服务器/域上)。

我怎么做?我错过了什么?这只是一个设置路由指向WebAPI服务器的问题吗?我发现的所有示例都展示了如何使用MVC应用程序来使用WebAPI,这似乎假设WebAPI已被“baked”到MVC应用程序中,或者至少位于同一台服务器上。

我不是在谈论使用jQuery的Ajax调用...我的意思是MVC应用程序的控制器应该使用WebAPI来获取/放置数据。

提问于
用户回答回答于

你应该使用新的HttpClient来使用你的HTTP API。我还可以建议你使你的调用完全异步。由于ASP.NET MVC控制器操作支持基于任务的异步编程模式,它非常强大且简单。

这是一个过分简化的例子。以下代码是示例请求的帮助器类:

public class CarRESTService {

    readonly string uri = "http://localhost:2236/api/cars";

    public async Task<List<Car>> GetCarsAsync() {

        using (HttpClient httpClient = new HttpClient()) {

            return JsonConvert.DeserializeObject<List<Car>>(
                await httpClient.GetStringAsync(uri)    
            );
        }
    }
}

然后,我可以通过MVC控制器异步地使用它,如下所示:

public class HomeController : Controller {

    private CarRESTService service = new CarRESTService();

    public async Task<ActionResult> Index() {

        return View("index",
            await service.GetCarsAsync()
        );
    }
}

可以查看下面的文章,以了解使用ASP.NETMVC进行异步I/O操作的效果:

我对C#5.0和ASP.NETMVCWeb应用程序中基于任务的异步编程的看法

用户回答回答于

对于我的CarsRESTService帮手:

public class CarsRESTService
{
    readonly string baseUri = "http://localhost:9661/api/cars/";

    public List<Car> GetCars()
    {
        string uri = baseUri;
        using (HttpClient httpClient = new HttpClient())
        {
            Task<String> response = httpClient.GetStringAsync(uri);
            return JsonConvert.DeserializeObjectAsync<List<Car>>(response.Result).Result;
        }
    }

    public Car GetCarById(int id)
    {
        string uri = baseUri + id;
        using (HttpClient httpClient = new HttpClient())
        {
            Task<String> response = httpClient.GetStringAsync(uri);
            return JsonConvert.DeserializeObjectAsync<Car>(response.Result).Result;
        }
    }
}

然后是CarsController.cs:

public class CarsController : Controller
{
    private CarsRESTService carsService = new CarsRESTService();

    //
    // GET: /Cars/

    public ActionResult Index()
    {
        return View(carsService.GetCars());
    }

    //
    // GET: /Cars/Details/5

    public ActionResult Details(int id = 0)
    {
        Car car = carsService.GetCarById(id);

        if (car == null)
        {
            return HttpNotFound();
        }
        return View(car);
    }
}

扫码关注云+社区