Không thể cấu hình WEB API trong web.config file.
Web API hỗ trợ code-based configuration. Không thể cấu hình trong web.config file.
Có thể cấu hình WEB API để tùy chỉnh hành vi của Web API hosting infrastructure và components như:
- Routes
- Formatters
- Filters
- Dependency Resolver
- Message Handlers
- ParameterBindingRules
- Properties
- Services
Routes
Public methods của controller gọi là action methods. Khi Web API framework nhận request, nó route request đến action. Để xác định action nào invoke, framework dùng routing table.
routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
Formatters
ASP.NET Core MVC hỗ trợ data exchange trong Web APIs dùng input và output formatters. Input formatters dùng cho Model Binding. Output formatters dùng để format responses.
Dùng custom formatter để thêm support cho content type không được built-in formatters handle.
Filters
Filters dùng để cung cấp cross-cutting features như logging, exception handling, performance measurement, authentication và authorization.
Dependency Resolver
Web API định nghĩa interface IDependencyResolver để resolve dependencies.
Message Handlers
Message handlers trong Web API cung cấp process, edit, hoặc decline incoming request trước khi nó đến HttpControllerDispatcher.
ParameterBindingRules
Khi Web API gọi method trên controller, nó phải set values cho parameters, process gọi là binding.
Cấu hình trong WebApiConfig.cs (Code-based)
public static class WebApiConfig {
public static void Register(HttpConfiguration config) {
// 1. Routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
// 2. Formatters - Chỉ JSON
config.Formatters.Remove(config.Formatters.XmlFormatter);
config.Formatters.JsonFormatter.SerializerSettings
.ContractResolver = new CamelCasePropertyNamesContractResolver();
config.Formatters.JsonFormatter.SerializerSettings
.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc;
// 3. Filters - Global
config.Filters.Add(new AuthorizeAttribute());
config.Filters.Add(new ValidateModelAttribute());
// 4. Message Handlers
config.MessageHandlers.Add(new LoggingHandler());
config.MessageHandlers.Add(new CompressionHandler());
// 5. Dependency Resolver (ví dụ Autofac, Unity, Ninject)
// config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
// 6. Parameter Binding Rules
// config.ParameterBindingRules.Insert(0, descriptor =>
// typeof(IEnumerable).IsAssignableFrom(descriptor.ParameterType)
// ? new CommaSeparatedModelBinder()
// : null);
// 7. Services - Replace default services
// config.Services.Replace(typeof(IContentNegotiator), new CustomContentNegotiator());
// config.Services.Replace(typeof(IHttpControllerActivator), new CustomControllerActivator());
}
}
Web.config - Chỉ cấu hình Hosting/IIS
Web.config KHÔNG cấu hình Web API logic, chỉ cấu hình hosting:
<configuration>
<system.webServer>
<!-- Chạy all requests qua ASP.NET pipeline -->
<modules runAllManagedModulesForAllRequests="true" />
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0"
path="*." verb="*"
type="System.Web.Handlers.TransferRequestHandler"
preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
<!-- CORS headers (nếu không dùng handler) -->
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET,POST,PUT,DELETE,OPTIONS" />
<add name="Access-Control-Allow-Headers" value="Content-Type,Authorization" />
</customHeaders>
</httpProtocol>
</system.webServer>
<!-- Connection strings, appSettings -->
<connectionStrings>
<add name="DefaultConnection"
connectionString="Server=.;Database=MyDb;Trusted_Connection=True;"
providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>
ASP.NET Core - appsettings.json + Program.cs
ASP.NET Core không dùng WebApiConfig hay Global.asax. Cấu hình tập trung trong:
- appsettings.json - Configuration data
- Program.cs / Startup.cs - Code-based configuration (DI, Middleware, Routing, Filters, Formatters)
// Program.cs (.NET 6+)
var builder = WebApplication.CreateBuilder(args);
// Configuration
builder.Configuration.AddJsonFile("appsettings.json");
// Services (DI, Filters, Formatters, etc.)
builder.Services.AddControllers(options => {
options.Filters.Add();
}).AddJsonOptions(options => {
options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
});
// Custom services
builder.Services.AddScoped();
var app = builder.Build();
// Middleware Pipeline (thay thế Message Handlers)
app.UseMiddleware();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();