web-dev-qa-db-de.com

Unterschied zwischen ApiController und Controller in ASP.NET MVC

Ich habe mit ASP.NET MVC 4 Beta herumgespielt und sehe jetzt zwei Arten von Controllern: ApiController und Controller

Ich bin wenig verwirrt, in welchen Situationen ich einen bestimmten Controller auswählen kann. 

Zum Beispiel: Wenn ich eine Ansicht zurückgeben möchte, muss ich ApiController oder die gewöhnliche Controller verwenden? Mir ist bekannt, dass die WCF-Web-API jetzt in MVC integriert ist. 

Da wir nun beide Controller verwenden können, kann jemand bitte darauf hinweisen, welche Situationen für den entsprechenden Controller gelten sollen.

295
VJAI

Verwenden Sie Controller, um Ihre normalen Ansichten zu rendern. Die ApiController-Aktion gibt nur Daten zurück, die serialisiert und an den Client gesendet werden.

hier ist der Link

Zitat:

Hinweis Wenn Sie mit ASP.NET MVC gearbeitet haben, sind Sie mit Controllern bereits vertraut. Sie funktionieren in Web-API ähnlich, Controller in Web-API werden jedoch von der ApiController-Klasse anstatt von der Controller-Klasse abgeleitet. Der erste große Unterschied, den Sie feststellen werden, besteht darin, dass Aktionen auf Web-API-Controllern keine Ansichten zurückgeben, sondern Daten.

ApiControllers sind darauf spezialisiert, Daten zurückzugeben. Sie sorgen beispielsweise dafür, dass die Daten transparent in das vom Client angeforderte Format serialisiert werden. Außerdem folgen sie standardmäßig einem anderen Routing-Schema (z. B.: Zuordnen von URLs zu Aktionen), wobei eine REST-API nach Konventionen bereitgestellt wird. 

Sie könnten wahrscheinlich etwas mit einem Controller anstelle eines ApiControllers mit der manuellen (?) Codierung tun. Am Ende bauen beide Controller auf der ASP.NET-Basis auf. Die Verwendung einer REST-vollständigen API ist heutzutage eine so häufige Anforderung, dass die WebAPI erstellt wurde, um die Implementierung einer solchen API zu vereinfachen.

Es ist ziemlich einfach, zwischen den beiden zu entscheiden: Wenn Sie eine HTML-basierte Web-/Internet-/Intranet-Anwendung schreiben - vielleicht mit dem gelegentlichen AJAX -Ruf, der json hier und dort zurückgibt - bleiben Sie bei MVC/Controller. Wenn Sie einem System eine datengesteuerte/REST-vollständige Schnittstelle bereitstellen möchten, verwenden Sie die WebAPI. Sie können natürlich beide kombinieren, indem Sie einen ApiController AJAX von einer MVC-Seite aus aufrufen.

Um ein reales Beispiel zu geben: Ich arbeite derzeit mit einem ERP - System, das eine REST-vollständige API für seine Entitäten bereitstellt. Für diese API wäre WebAPI ein guter Kandidat. Gleichzeitig stellt das ERP - System eine hochgradig AJAX-fähige Webanwendung bereit, mit der Sie Abfragen für die REST-vollständige API erstellen können. Die Webanwendung selbst könnte als MVC-Anwendung implementiert werden, wobei die WebAPI zum Abrufen von Metadaten usw. verwendet wird.

308
Andre Loker

Was würdest du lieber schreiben und pflegen?

ASP.NET-MVC

public class TweetsController : Controller {
  // GET: /Tweets/
  [HttpGet]
  public ActionResult Index() {
    return Json(Twitter.GetTweets(), JsonRequestBehavior.AllowGet);
  }
}

ASP.NET-Web-API

public class TweetsController : ApiController {
  // GET: /Api/Tweets/
  public List<Tweet> Get() {
    return Twitter.GetTweets();
  }
}
167
Manish Jain

Ich liebe die Tatsache, dass die MVC6 von ASP.NET Core die beiden Muster zu einem zusammengefügt hat, da ich oft beide Welten unterstützen muss. Es ist zwar richtig, dass Sie jeden Standard-MVC Controller (und/oder Ihre eigenen ActionResult-Klassen) so anpassen können, dass er sich wie ein ApiController verhält, aber es ist sehr schwierig zu warten und zu testen: Darüber hinaus haben Sie Controller -Methoden, die ActionResult mit anderen zurückgeben, die rohe/serialisierte/IHttpActionResult-Daten zurückgeben, können aus Entwicklerperspektive sehr verwirrend sein, insbesondere wenn Sie nicht alleine arbeiten und andere Entwickler mit diesem hybriden Ansatz beschleunigen müssen.

Die beste Methode, die ich bisher zur Minimierung dieses Problems in ASP.NET-Nicht-Core-Webanwendungen verwendet habe, besteht darin, das Web-API-Paket in die MVC-basierte Webanwendung zu importieren (und ordnungsgemäß zu konfigurieren), sodass ich das Beste aus beiden haben kann Welten: Controllers für Views, ApiControllers für Daten.

Dazu müssen Sie Folgendes tun:

  • Installieren Sie die folgenden Web-API-Pakete mit NuGet: Microsoft.AspNet.WebApi.Core und Microsoft.AspNet.WebApi.WebHost.
  • Fügen Sie einen oder mehrere ApiController zu Ihrem /Controllers/-Ordner hinzu.
  • Fügen Sie Ihrem Ordner /App_Config/ die folgende Datei WebApiConfig.cs hinzu:

using System.Web.Http;

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

Schließlich müssen Sie die obige Klasse in Ihrer Startup -Klasse registrieren (entweder Startup.cs oder Global.asax.cs, je nachdem, ob Sie die OWIN-Startvorlage verwenden oder nicht).

Startup.cs

 public void Configuration(IAppBuilder app)
 {
    // Register Web API routing support before anything else
    GlobalConfiguration.Configure(WebApiConfig.Register);

    // The rest of your file goes there
    // ...
    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);

    ConfigureAuth(app);
    // ...
}

Global.asax.cs

protected void Application_Start()
{
    // Register Web API routing support before anything else
    GlobalConfiguration.Configure(WebApiConfig.Register);

    // The rest of your file goes there
    // ...
    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
    // ...
}

Dieser Ansatz - zusammen mit seinen Vor- und Nachteilen - wird in diesem Beitrag , den ich in meinem Blog geschrieben habe, näher erläutert.

23
Darkseal

Jede Methode in der Web-API gibt Daten (JSON) ohne Serialisierung zurück.

Um jedoch JSON-Daten in MVC-Controllern zurückzugeben, setzen wir den zurückgegebenen Action Result-Typ auf JsonResult und rufen die Json-Methode für unser Objekt auf, um sicherzustellen, dass es in JSON gepackt ist.

1
Shailesh Uke

Es ist fast eins, aber es ist anders Name, Verwendungszweck und Transparenz zwischen MVC und API.

0
user11592203

Der Hauptunterschied ist: Das Web-API ist ein Dienst für jeden Client, alle Geräte und MVC Controller dient nur seinem Client. Das gleiche, weil es eine MVC-Plattform ist.

0
Anjyr

Es ist ziemlich einfach, zwischen den beiden zu entscheiden: Wenn Sie eine HTML-basierte Web-/Internet-/Intranet-Anwendung schreiben - vielleicht mit dem gelegentlichen AJAX -Ruf, der json hier und dort zurückgibt - bleiben Sie bei MVC/Controller. Wenn Sie einem System eine datengesteuerte/REST-vollständige Schnittstelle bereitstellen möchten, verwenden Sie die WebAPI. Sie können natürlich beide kombinieren, indem Sie einen ApiController AJAX -Aufruf von einer MVC-Seite aus bedienen . Grundsätzlich wird ein Controller für mvc und ein API-Controller für Rest -.__ verwendet. Mit der API können Sie beide in demselben Programm verwenden, das Sie benötigen

0
user9521236