我以前创建了几个ASP.NET MVC应用程序,但我以前从未使用过WebAPI。我想知道如何创建一个简单的MVC 4应用程序,通过WebAPI而不是通过普通的MVC控制器来完成简单的CRUD。诀窍是WebAPI应该是一个单独的解决方案(事实上,很可能在不同的服务器/域上)。
我该怎么做?我错过了什么?是否只是设置路由指向WebAPI的服务器?我发现的所有示例都展示了如何使用MVC应用程序使用WebAPI似乎假设WebAPI已经“融入”MVC应用程序,或者至少在同一服务器上。
哦,澄清一点,我不是在谈论使用jQuery的Ajax调用......我的意思是MVC应用程序的控制器应该使用WebAPI来获取/放置数据。
答案 0 :(得分:81)
您应该使用新的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.NET MVC的异步I / O操作的效果:
My Take on Task-based Asynchronous Programming in C# 5.0 and ASP.NET MVC Web Applications
答案 1 :(得分:18)
感谢大家的回复。我认为@tugberk让我走上了正确的道路。这对我有用......
我的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);
}
}
答案 2 :(得分:10)
您可以使用WCF来使用该服务。像这样:
[ServiceContract]
public interface IDogService
{
[OperationContract]
[WebGet(UriTemplate = "/api/dog")]
IEnumerable<Dog> List();
}
public class DogServiceClient : ClientBase<IDogService>, IDogService
{
public DogServiceClient(string endpointConfigurationName) : base(endpointConfigurationName)
{
}
public IEnumerable<Dog> List()
{
return Channel.List();
}
}
然后你可以在控制器中使用它:
public class HomeController : Controller
{
public HomeController()
{
}
public ActionResult List()
{
var service = new DogServiceClient("YourEndpoint");
var dogs = service.List();
return View(dogs);
}
}
在您的web.config中,您可以为您的终端设置配置:
<system.serviceModel>
<client>
<endpoint address="http://localhost/DogService" binding="webHttpBinding"
bindingConfiguration="" behaviorConfiguration="DogServiceConfig"
contract="IDogService" name="YourEndpoint" />
</client>
<behaviors>
<endpointBehaviors>
<behavior name="DogServiceConfig">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
答案 3 :(得分:1)
http://restsharp.org/是您问题的答案。我目前在具有类似结构的应用程序中使用它。
但更常见的是使用WebAPI只是发布和请求数据如何处理取决于您。您甚至可以使用标准的WebRequest和JavascriptSerializer。
干杯。
答案 4 :(得分:1)
在这种情况下,您可以使用HttpClient来使用控制器中的Web API。