Подтвердить что ты не робот

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 для получения/размещения данных.

4b9b3361

Ответ 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 с вашего контроллера.