Ich liebe die Tatsache, dass MVC6 von ASP.NET Core die beiden Muster zu einem zusammengeführt hat, da ich oft beide Welten unterstützen muss. Es ist zwar richtig, dass Sie jede Standard-MVC optimieren Controller
(und / oder Ihre eigenen ActionResult
Klassen entwickeln) können, um sich wie eine zu verhalten ApiController
, aber es kann sehr schwierig sein, sie zu warten und zu testen: Darüber hinaus müssen die zurückgegebenen Controller- Methoden ActionResult
mit anderen gemischt werden Die Rückgabe von Rohdaten / serialisierten IHttpActionResult
Daten / Daten kann aus Entwicklersicht sehr verwirrend sein, insbesondere wenn Sie nicht alleine arbeiten und andere Entwickler mit diesem hybriden Ansatz auf den neuesten Stand bringen müssen.
Die beste Technik, die ich bisher entwickelt habe, um dieses Problem in ASP.NET-Nicht-Core-Webanwendungen zu minimieren, besteht darin, das Web-API-Paket in die MVC-basierte Webanwendung zu importieren (und ordnungsgemäß zu konfigurieren), damit ich das Beste aus beiden herausholen kann Welten: Controllers
für Ansichten, 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 Ihrem
/Controllers/
Ordner einen oder mehrere ApiController hinzu.
- Fügen Sie Ihrem
/App_Config/
Ordner 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 oben genannte Klasse in Ihrer Startup- Klasse registrieren (entweder Startup.cs
oder Global.asax.cs
, je nachdem, ob Sie die OWIN-Startup-Vorlage 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 .
ApiController
undController
so , wenn Sie mit dem neueren .NET Sie ApiController Sorgen nicht mehr brauchen - docs.microsoft.com/en-us/aspnet/core/tutorials/first-web- api