web-dev-qa-db-fra.com

Application ASP.NET MVC 4 appelant WebAPI à distance

J'ai déjà créé quelques applications ASP.NET MVC, mais je n'avais jamais utilisé WebAPI auparavant. Je me demande comment je pourrais créer une application MVC 4 simple qui effectue des opérations CRUD simples via WebAPI plutôt que via un contrôleur MVC normal. L'astuce est que WebAPI doit constituer une solution distincte (et pourrait même très bien se trouver sur un serveur/domaine différent).

Comment je fais ça? Qu'est-ce que je rate? S'agit-il simplement de configurer des itinéraires pour pointer vers le serveur WebAPI? Tous les exemples que j'ai trouvés montrant comment utiliser les WebAPI à l'aide d'une application MVC semblent supposer que la WebAPI est "intégrée" à l'application MVC, ou du moins qu'elle se trouve sur le même serveur.

Oh, et pour clarifier, je ne parle pas d'appels Ajax utilisant jQuery ... Je veux dire que le contrôleur de l'application MVC doit utiliser WebAPI pour obtenir/mettre des données.

59
Glenn Arndt

Vous devez utiliser le nouveau serveur HttpClient pour utiliser vos API HTTP. Ce que je peux également vous conseiller de rendre vos appels entièrement asynchrones. Étant donné que les actions du contrôleur ASP.NET MVC prennent en charge le modèle de programmation asynchrone basé sur les tâches, il est assez puissant et simple.

Voici un exemple trop simplifié. Le code suivant est la classe d'assistance pour un exemple de demande:

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

Ensuite, je peux consommer cela via mon contrôleur MVC de manière asynchrone comme ci-dessous:

public class HomeController : Controller {

    private CarRESTService service = new CarRESTService();

    public async Task<ActionResult> Index() {

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

Vous pouvez consulter l'article ci-dessous pour voir les effets des opérations d'E/S asynchrones avec ASP.NET MVC:

Mon point sur la programmation asynchrone basée sur les tâches dans les applications Web C # 5.0 et ASP.NET MVC

81
tugberk

Merci à tous pour les réponses. @tugberk m'a conduit dans la bonne voie, je pense. Cela a fonctionné pour moi ...

Pour mon assistant 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;
        }
    }
}

Et ensuite pour 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);
    }
}
18
Glenn Arndt

Vous pouvez utiliser WCF pour utiliser le service. Ainsi:

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

Et puis vous pouvez le consommer dans votre contrôleur:

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

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

Et dans votre web.config, vous placez la configuration de votre ordinateur d'extrémité:

<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
peco

http://restsharp.org/ est la réponse à vos questions. Je l'utilise actuellement dans une application ayant une structure similaire.

Mais plus généralement, l’utilisation de WebAPI consiste simplement à publier et à demander le traitement des données. Vous pouvez même utiliser WebRequest standard et JavascriptSerializer.

À votre santé.

1
Onur Topal

Dans ce cas, vous pouvez utiliser HttpClient pour utiliser l'API Web de votre contrôleur.

1
cuongle