it-swarm.com.de

ASP.NET MVC 4-Anwendung, die Remote-WebAPI aufruft

Ich habe in der Vergangenheit einige ASP.NET MVC-Anwendungen erstellt, aber noch nie zuvor WebAPIs verwendet. Ich frage mich, wie ich eine einfache MVC 4-App erstellen könnte, die einfache CRUD-Aufgaben über WebAPI und nicht über einen normalen MVC-Controller erledigt. Der Trick ist, dass das WebAPI eine separate Lösung sein sollte (und sich in der Tat durchaus auf einem anderen Server/einer anderen Domäne befinden könnte).

Wie mache ich das? Was vermisse ich? Geht es nur darum, Routen einzurichten, die auf den WebAPI-Server verweisen? Alle Beispiele, die ich für die Verwendung von WebAPIs mit einer MVC-Anwendung gefunden habe, scheinen davon auszugehen, dass die WebAPI in der MVC-Anwendung "eingebrannt" ist oder sich zumindest auf demselben Server befindet.

Oh, und zur Klarstellung, ich spreche nicht über Ajax-Aufrufe mit jQuery ... Ich meine, dass der Controller der MVC-Anwendung das WebAPI verwenden sollte, um Daten abzurufen/abzulegen.

59
Glenn Arndt

Sie sollten den neuen HttpClient verwenden, um Ihre HTTP-APIs zu verwenden. Was ich Ihnen zusätzlich raten kann, sind Ihre Anrufe völlig asynchron. Da ASP.NET MVC-Controlleraktionen das aufgabenbasierte asynchrone Programmiermodell unterstützen, ist es ziemlich leistungsstark und einfach.

Hier ist ein stark vereinfachtes Beispiel. Der folgende Code ist die Hilfsklasse für eine Beispielanforderung:

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

Dann kann ich das über meinen MVC-Controller asynchron wie folgt verarbeiten:

public class HomeController : Controller {

    private CarRESTService service = new CarRESTService();

    public async Task<ActionResult> Index() {

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

Im folgenden Beitrag können Sie die Auswirkungen asynchroner E/A-Vorgänge mit ASP.NET MVC nachlesen:

Meine Übernahme der aufgabenbasierten asynchronen Programmierung in C # 5.0- und ASP.NET MVC-Webanwendungen

81
tugberk

Vielen Dank an alle für die Antworten. @tugberk hat mich auf den richtigen Weg geführt, denke ich. Das hat bei mir funktioniert ...

Für meinen CarsRESTService Helfer:

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

Und dann für 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

Sie können WCF verwenden, um den Dienst zu nutzen. Wie so:

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

Und dann können Sie es in Ihrem Controller verbrauchen:

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

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

Und in Ihrer web.config platzieren Sie die Konfiguration für Ihren Endpunkt:

<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/ ist die Antwort auf Ihre Fragen. Ich verwende es derzeit in einer Anwendung mit ähnlicher Struktur.

Generell bedeutet die Verwendung von WebAPI jedoch nur, dass Sie die zu verarbeitenden Daten veröffentlichen und anfordern. Sie können sogar Standard-WebRequest und JavascriptSerializer verwenden.

Prost.

1
Onur Topal

In diesem Fall können Sie HttpClient verwenden, um die Web-API von Ihrem Controller zu verwenden.

1
cuongle