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 ActionResult
lớ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 ActionResult
trộn lẫn với các lớp khác trả về dữ liệu thô / tuần tự / IHttpActionResult
dữ 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: Controllers
cho Lượt xem, ApiControllers
cho 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.Core
và 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.cs
hoặ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.
ApiController
vàController
vì 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