โปรดทราบว่าคำตอบนี้เป็นจริงถึง MVC 5 / Web API 2
คำตอบสั้น ๆ :ตัวกรอง MVC และ Web API ไม่สามารถใช้งานร่วมกันได้และหากคุณต้องการลงทะเบียนทั่วโลกคุณต้องใช้คลาสการกำหนดค่าที่เหมาะสมสำหรับแต่ละรายการ
คำตอบแบบยาว: ASP.NET MVC และ Web API ได้รับการออกแบบมาโดยเฉพาะเพื่อให้ทำงานในลักษณะเดียวกัน แต่แท้จริงแล้วเป็นสิ่งมีชีวิตที่แตกต่างกัน
Web API อยู่ภายใต้System.Web.Http
เนมสเปซในขณะที่ MVC อยู่ภายใต้System.Web.Mvc
เนมสเปซ ทั้งสองจะอยู่เคียงข้างกันอย่างมีความสุข แต่ไม่มีอีกคนหนึ่งและแม้จะมีความคล้ายคลึงกันในรูปแบบการเขียนโปรแกรมการใช้งานพื้นฐานก็แตกต่างกัน เช่นเดียวกับตัวควบคุม MVC และตัวควบคุม Web API จะสืบทอดคลาสคอนโทรลเลอร์พื้นฐานที่แตกต่างกัน (MVC มีชื่อเรียกง่ายๆController
และชื่อของWeb API ApiController
) ตัวกรอง MVC และตัวกรอง Web API สืบทอดมาจากFilterAttribute
คลาสที่แตกต่างกัน(ทั้งสองใช้ชื่อเดียวกันในกรณีนี้ แต่เป็นคลาสแยกกันที่มีชีวิตอยู่ ในเนมสเปซตามลำดับ)
ตัวกรองส่วนกลางของ Web API จะลงทะเบียนผ่านHttpConfiguration
อ็อบเจ็กต์ที่มีให้คุณในRegister
เมธอด WebApiConfig.cs หากคุณใช้เทมเพลตโปรเจ็กต์กับ WebActivator:
public static void Register(HttpConfiguration config)
{
config.Filters.Add(new MyWebApiFilter());
}
หรืออย่างอื่นใน global.asax.cs:
GlobalConfiguration.Configuration.Filters.Add(new MyWebApiFilter());
ตัวกรองส่วนกลาง Mvc ได้รับการลงทะเบียนโดยใช้GlobalFilterCollection
อ็อบเจ็กต์ซึ่งพร้อมใช้งานสำหรับคุณผ่านRegisterGlobalFilters
วิธีการ FilterConfig.cs สำหรับโปรเจ็กต์ที่ใช้ WebActivator:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new MyMvcFilter());
}
}
หรือในไฟล์ global.asax.cs โดยวิธีการGlobalFilters.Filters
รวบรวมสำหรับผู้ที่ไม่มี WebActivator:
GlobalFilters.Filters.Add(new MyMvcFilter());
เป็นที่น่าสังเกตว่าในทั้งสองกรณีคุณไม่จำเป็นต้องสืบทอดจากFilterAttribute
ประเภทที่เหมาะสม ตัวกรอง Web API จำเป็นต้องใช้อินเทอร์เฟซ System.Web.Http.IFilter เท่านั้นในขณะที่การลงทะเบียนตัวกรอง MVC จะตรวจสอบเพื่อให้แน่ใจว่าคลาสของคุณสืบทอดอินเทอร์เฟซตัวกรองจำนวนหนึ่งที่กำหนดไว้ในSystem.Web.Mvc
เนมสเปซ