ASP.NET MVC 4 Application Calling Remote WebAPI
В прошлом я создал несколько приложений ASP.NET MVC, но раньше я никогда не использовал WebAPI. Мне интересно, как я могу создать простое приложение MVC 4, которое делает простой материал CRUD через WebAPI вместо обычного контроллера MVC. Фокус в том, что WebAPI должен быть отдельным решением (и, на самом деле, вполне может быть на другом сервере/домене).
Как мне это сделать? Что мне не хватает? Это просто вопрос настройки маршрутов для указания на сервер WebAPI? Все примеры, которые я нашел, показывающие, как использовать WebAPI с использованием приложения MVC, похоже, предполагают, что WebAPI "испечен" в приложении MVC или, по крайней мере, находится на одном сервере.
О, и пояснить, я не говорю о вызовах Ajax с использованием jQuery... Я имею в виду, что контроллер приложений MVC должен использовать WebAPI для получения/размещения данных.
Ответы
Ответ 1
Вы должны использовать новый 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:
Мое асинхронное программирование на основе задач на С# 5.0 и веб-приложениях ASP.NET MVC
Ответ 2
Спасибо всем за ответы. Думаю, @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);
}
}
Ответ 3
Вы можете использовать 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>
Ответ 4
http://restsharp.org/ - ответ на ваши вопросы. В настоящее время я использую его в приложении, которое имеет аналогичную структуру.
Но в более общем плане использование WebAPI - это просто публикация и запрос данных о том, как обрабатывать, зависит от вас. Вы даже можете использовать стандартные WebRequest и JavascriptSerializer.
Приветствия.
Ответ 5
В этом случае вы можете использовать HttpClient для использования веб-API с вашего контроллера.