ไม่สามารถ Configure Web API ใน web.config ได้
Web API รองรับ Code-based Configuration เท่านั้น ไม่สามารถ Configure ใน web.config File ได้
เราสามารถ Configure Web API เพื่อปรับแต่งพฤติกรรมของ Web API Hosting Infrastructure และ Components เช่น:
- Routes - Public Methods ของ Controller เรียกว่า Action Methods
- Formatters - Input/Output Formatters สำหรับ Data Exchange
- Filters - Cross-cutting Features (Logging, Exception Handling, Auth)
- Dependency Resolver - IDependencyResolver Interface
- Message Handlers - Process/Edit/Decline Request ก่อนถึง Controller
- ParameterBindingRules - กฎการ Bind Parameters
- Properties - Custom Properties
- Services - Custom Services
การกำหนดค่า Routes
public static class WebApiConfig {
public static void Register(HttpConfiguration config) {
// Attribute Routing
config.MapHttpAttributeRoutes();
// Convention-based Routing
config.Routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
// Route with Constraints
config.Routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional },
constraints: new { id = @"\d+" }
);
}
}
การกำหนดค่า Formatters
public static class WebApiConfig {
public static void Register(HttpConfiguration config) {
// JSON Formatter Settings
var jsonFormatter = config.Formatters.JsonFormatter;
jsonFormatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;
jsonFormatter.SerializerSettings.ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver();
jsonFormatter.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
jsonFormatter.SerializerSettings.DateFormatString = "yyyy-MM-ddTHH:mm:ssZ";
// Remove XML Formatter (Force JSON Only)
config.Formatters.Remove(config.Formatters.XmlFormatter);
// Add Custom Formatter
config.Formatters.Add(new CsvMediaTypeFormatter());
}
}
การกำหนดค่า Filters
public static class WebApiConfig {
public static void Register(HttpConfiguration config) {
// Global Filters
config.Filters.Add(new AuthorizeAttribute());
config.Filters.Add(new HandleErrorAttribute());
config.Filters.Add(new CustomActionFilterAttribute());
// หรือใช้ Filter Providers
config.Services.Replace(typeof(IFilterProvider), new CustomFilterProvider());
}
}
การกำหนดค่า Dependency Resolver
// ใช้ Unity, Autofac, Ninject, SimpleInjector, หรือ Built-in (ASP.NET Core)
public static class WebApiConfig {
public static void Register(HttpConfiguration config) {
var container = new UnityContainer();
container.RegisterType();
config.DependencyResolver = new UnityDependencyResolver(container);
}
}
การกำหนดค่า Message Handlers
public static class WebApiConfig {
public static void Register(HttpConfiguration config) {
// Order matters: First added = Outermost
config.MessageHandlers.Add(new LoggingHandler());
config.MessageHandlers.Add(new AuthenticationHandler());
config.MessageHandlers.Add(new RateLimitingHandler());
}
}
การกำหนดค่า Parameter Binding Rules
public static class WebApiConfig {
public static void Register(HttpConfiguration config) {
// Custom Parameter Binding Rule
config.ParameterBindingRules.Insert(0, descriptor => {
if (descriptor.ParameterType == typeof(DateTime) && descriptor.ParameterName == "date") {
return new CustomDateTimeParameterBinding(descriptor);
}
return null; // Use default
});
}
}
WebApiConfig Registration ใน Global.asax
public class WebApiApplication : System.Web.HttpApplication {
protected void Application_Start() {
GlobalConfiguration.Configure(WebApiConfig.Register);
// หรือแบบเก่า
// WebApiConfig.Register(GlobalConfiguration.Configuration);
}
}
สรุป: Web API Configuration = Code-Based เท่านั้น
ไม่มี XML Configuration ใน web.config สำหรับ Web API Pipeline ทั้งหมดถูก Configure ผ่าน HttpConfiguration Object ใน WebApiConfig.Register Method