ASP.NET aplikacja MVC 4 wywołująca zdalne WebAPI

Stworzyłem parę ASP.NET aplikacje MVC w przeszłości, ale nigdy wcześniej nie korzystałem z WebAPIs. Zastanawiam się, jak mogę stworzyć prostą aplikację MVC 4, która robi proste rzeczy CRUD przez WebAPI zamiast za pośrednictwem zwykłego kontrolera MVC. Sztuczka polega na tym, że WebAPI powinno być osobnym rozwiązaniem (a w rzeczywistości może być bardzo dobrze na innym serwerze/domenie).

Jak to zrobić? Co przegapiłem? Czy to tylko kwestia ustawienia tras wskazujących na serwer WebAPI? Wszystkie przykłady, które znalazłem pokazujące, jak korzystać z WebAPI za pomocą aplikacji MVC wydają się zakładać, że WebAPI jest "upieczony" do aplikacji MVC, lub przynajmniej jest na tym samym serwerze.

Aha, i dla jasności, nie mówię o wywołaniach Ajax za pomocą jQuery... Chodzi mi o to, że kontroler aplikacji MVC powinien używać WebAPI do pobierania/wprowadzania danych.

Author: j0k, 2012-11-02

5 answers

Powinieneś użyć nowego HttpClient, aby korzystać z interfejsów API HTTP. Co mogę dodatkowo doradzić, aby połączenia w pełni asynchroniczne. Jako ASP.NET działania kontrolera MVC wspierają asynchroniczny model programowania oparty na zadaniach, jest dość wydajny i łatwy.

Oto zbyt uproszczony przykład. Poniższy kod jest klasą pomocniczą dla przykładowego żądania:

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)    
            );
        }
    }
}

Następnie mogę to wykorzystać poprzez MÓJ kontroler MVC asynchronicznie jak poniżej:

public class HomeController : Controller {

    private CarRESTService service = new CarRESTService();

    public async Task<ActionResult> Index() {

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

Możesz spojrzeć w poniższym poście, aby zobaczyć efekty asynchronicznych operacji We/Wy z ASP.NET MVC:

Moje podejście do Zadaniowego programowania asynchronicznego w C # 5.0 i ASP.NET aplikacje webowe MVC

 77
Author: tugberk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-29 18:53:22

Dzięki wszystkim za odpowiedzi. @tugberk To mi pomogło...

Dla mojego pomocnika 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;
        }
    }
}

A następnie dla 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);
    }
}
 16
Author: Glenn Arndt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-05 18:50:14

Możesz użyć WCF do korzystania z usługi. Tak:

[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();
    }
}

I wtedy możesz go spożywać w swoim kontrolerze:

public class HomeController : Controller
{
    public HomeController()
    {
    }

    public ActionResult List()
    {
        var service = new DogServiceClient("YourEndpoint");
        var dogs = service.List();
        return View(dogs);
    }
}

I w Twojej sieci.config umieszczasz konfigurację dla punktu końcowego:

<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>
 10
Author: peco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-27 18:55:08

Http://restsharp.org / jest odpowiedzią na twoje pytania. Obecnie używam go w aplikacji o podobnej strukturze.

Ale bardziej ogólnie korzystanie z WebAPI to po prostu publikowanie i żądanie danych, jak przetwarzać, zależy od Ciebie. Można nawet użyć standardowego WebRequest i JavascriptSerializer.

Zdrówko.

 1
Author: Onur Topal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-03 01:06:53

W tym przypadku możesz użyć HttpClient do korzystania z interfejsu API z kontrolera.

 1
Author: Cuong Le,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-03 03:36:34