ฉันชอบความจริงที่ว่า MVC6 ของ ASP.NET Core ได้รวมสองรูปแบบเข้าด้วยกันเพราะฉันมักจะต้องการการสนับสนุนทั้งสองโลก ในขณะที่มันเป็นความจริงที่คุณสามารถปรับแต่ง MVC มาตรฐานใด ๆController(และ / หรือพัฒนาActionResultชั้นเรียนของคุณเอง) เพื่อทำหน้าที่และประพฤติเหมือนApiControllerมันอาจเป็นเรื่องยากมากที่จะรักษาและทดสอบ: นอกเหนือจากนั้นมีวิธีควบคุมกลับActionResultผสมกับผู้อื่น การส่งคืนข้อมูลดิบ / ต่อเนื่อง / IHttpActionResultข้อมูลอาจสร้างความสับสนอย่างมากจากมุมมองของนักพัฒนาโดยเฉพาะอย่างยิ่งหากคุณไม่ได้ทำงานคนเดียวและต้องทำให้นักพัฒนาซอฟต์แวร์รายอื่น ๆ
เทคนิคที่ดีที่สุดที่ฉันใช้มาจนถึงตอนนี้เพื่อลดปัญหาดังกล่าวในแอปพลิเคชันเว็บที่ไม่ใช่คอร์ ASP.NET คือการนำเข้า (และกำหนดค่าอย่างเหมาะสม) แพ็คเกจเว็บ API ลงในแอปพลิเคชันบนเว็บที่ใช้ MVC ดังนั้นฉันจึง โลก: Controllersสำหรับ Views ApiControllersสำหรับข้อมูล
ในการทำเช่นนั้นคุณต้องทำสิ่งต่อไปนี้:
- ติดตั้งแพคเกจดังต่อไปนี้ API เว็บโดยใช้ NuGet: และ
Microsoft.AspNet.WebApi.CoreMicrosoft.AspNet.WebApi.WebHost
- เพิ่ม ApiControllers หนึ่งรายการขึ้นไปใน
/Controllers/โฟลเดอร์ของคุณ
- เพิ่มไฟล์WebApiConfig.csต่อไปนี้ใน
/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 }
);
}
}
ท้ายสุดคุณจะต้องลงทะเบียนคลาสข้างต้นในคลาสเริ่มต้นของคุณ( Startup.csหรือGlobal.asax.csขึ้นอยู่กับว่าคุณใช้เทมเพลตการเริ่มต้น OWIN หรือไม่)
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);
// ...
}
วิธีการนี้ - พร้อมกับข้อดีและข้อเสีย - อธิบายเพิ่มเติมในโพสต์นี้ที่ฉันเขียนไว้ในบล็อกของฉัน
ApiControllerและControllerดังนั้นหากคุณกำลังใช้ใหม่ .NET คุณไม่จำเป็นต้องกังวลเกี่ยวกับ ApiController อีกต่อไป - docs.microsoft.com/en-us/aspnet/core/tutorials/first-web- api