mi piace il fatto che MVC6 di ASP.NET Nucleo fuse i due modelli in una sola, perché ho spesso bisogno di supportare sia mondi.Mentre è vero che puoi modificare qualsiasi MVC ActionResult
standard per agire & come un ApiController
, può essere molto difficile da mantenere e da testare: oltre a questo, avere Controller i metodi che restituiscono ActionResult
mescolati con altri che restituiscono dati raw/serializzati/IHttpActionResult
possono essere molto confusi dal punto di vista dello sviluppatore, specialmente se non si lavora da soli e occorre portare altri sviluppatori per accelerare con tale approccio ibrido.
La tecnica migliore che ho raggiunto finora per ridurre al minimo il problema nelle applicazioni Web ASP.NET non core è di importare (e configurare correttamente) il pacchetto dell'API Web nell'applicazione Web basata su MVC, così posso avere il meglio di entrambi i mondi: Controllers
per Views, ApiControllers
per i dati.
Per fare questo, è necessario effettuare le seguenti operazioni:
- installare i seguenti pacchetti Web API utilizzando NuGet:
Microsoft.AspNet.WebApi.Core
e Microsoft.AspNet.WebApi.WebHost
.
- Aggiungi uno o più ApiController alla tua cartella
/Controllers/
.
- Aggiungere i seguenti WebApiConfig.cs file nella cartella
/App_Config/
:
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 }
);
}
}
Infine, è necessario registrare la classe di cui sopra per il vostro avvio classe (sia Startup.cs
o Global.asax.cs
, a seconda se si sta usando OWIN Startup template o no).
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);
// ...
}
Questo approccio - insieme con i suoi vantaggi e svantaggi - è ulteriormente spiegato in the following post.
Importante: ASPNET Core ha "unito" ApiController' e 'Controller' quindi se si utilizza il .NET più recente non è più necessario preoccuparsi di ApiController - https://docs.microsoft.com/en -us/aspnet/core/tutorial/first-web-api –
Felice di averlo fatto! Ho previsto questo lungo ritorno dal modo in cui http://prideparrot.com/blog/archive/2012/10/asp_net_mvc_vs_webapi – VJAI