Tôi thích thực tế là MVC6 của ASP.NET Core đã hợp nhất hai mẫu thành một vì tôi thường cần hỗ trợ cả hai thế giới. Mặc dù đúng là bạn có thể điều chỉnh bất kỳ MVC tiêu chuẩn nào Controller(và / hoặc phát triển các ActionResultlớp của riêng bạn ) để hành động và hành xử giống như một ApiController, nhưng rất khó để duy trì và kiểm tra: trên hết, có các phương thức Bộ điều khiển quay lại ActionResulttrộn lẫn với các lớp khác trả về dữ liệu thô / tuần tự / IHttpActionResultdữ liệu có thể rất khó hiểu từ góc độ nhà phát triển, đặc biệt nếu bạn không làm việc một mình và cần đưa các nhà phát triển khác tăng tốc với phương pháp lai đó.
Kỹ thuật tốt nhất mà tôi đã có từ trước đến nay để giảm thiểu vấn đề đó trong các ứng dụng web không phải lõi của ASP.NET là nhập (và cấu hình đúng) gói API Web vào Ứng dụng web dựa trên MVC, vì vậy tôi có thể có cả hai tốt nhất thế giới: Controllerscho Lượt xem, ApiControllerscho dữ liệu.
Để làm điều đó, bạn cần làm như sau:
- Cài đặt các gói API Web sau bằng NuGet:
Microsoft.AspNet.WebApi.Corevà Microsoft.AspNet.WebApi.WebHost.
- Thêm một hoặc nhiều ApiControllers vào
/Controllers/ thư mục .
- Thêm tệp WebApiConfig.cs sau vào
/App_Config/thư mục của bạn :
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 }
);
}
}
Cuối cùng, bạn sẽ cần phải đăng ký lớp trên vào lớp Khởi động của mình ( Startup.cshoặc Global.asax.cs, tùy thuộc vào việc bạn có sử dụng mẫu Khởi động OWIN hay không).
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);
// ...
}
Toàn cầu.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);
// ...
}
Cách tiếp cận này - cùng với ưu và nhược điểm của nó - được giải thích thêm trong bài đăng này tôi đã viết trên blog của mình.
ApiControllervàControllervì vậy nếu bạn đang sử dụng .NET mới hơn, bạn không cần phải lo lắng về ApiContoder nữa - docs.microsoft.com/en-us/aspnet/core/tutorials/first-web- api