asp.net-core 通过网址路径设置请求区域性
示例
默认情况下,内置的“请求本地化”中间件仅支持通过查询,Cookie或Accept-Language标头设置区域性。这个例子展示了如何创建一个中间件,该中间件可以将文化设置为路径中的一部分,例如in/api/en-US/products。
此示例中间件假定语言环境位于路径的第二段中。
public class UrlRequestCultureProvider : RequestCultureProvider { private static readonly Regex LocalePattern = new Regex(@"^[a-z]{2}(-[a-z]{2,4})?$", RegexOptions.IgnoreCase); public override Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext) { if (httpContext == null) { throw new ArgumentNullException(nameof(httpContext)); } var url = httpContext.Request.Path; //目前无法使用httpContext.GetRouteData() //因为它使用放在httpContext.Features中的IRoutingFeature //路由中间件寄存器。本地化中间件时未设置 //被调用,因此此示例仅假设语言环境将始终 //位于路径的第二段,例如/api/en-US/products var parts = httpContext.Request.Path.Value.Split('/'); if (parts.Length < 3) { return Task.FromResult<ProviderCultureResult>(null); } if (!LocalePattern.IsMatch(parts[2])) { return Task.FromResult<ProviderCultureResult>(null); } var culture = parts[2]; return Task.FromResult(new ProviderCultureResult(culture)); } }
中间件注册
var localizationOptions = new RequestLocalizationOptions { SupportedCultures = new List<CultureInfo> { new CultureInfo("de-DE"), new CultureInfo("en-US"), new CultureInfo("en-GB") }, SupportedUICultures = new List<CultureInfo> { new CultureInfo("de-DE"), new CultureInfo("en-US"), new CultureInfo("en-GB") }, DefaultRequestCulture = new RequestCulture("en-US") }; //将我们的UrlRequestCultureProvider添加为列表中的第一个对象 localizationOptions.RequestCultureProviders.Insert(0, new UrlRequestCultureProvider { Options = localizationOptions }); app.UseRequestLocalization(localizationOptions);
自定义路线约束
“路线约束”示例中显示了如何添加和创建自定义路线约束。使用约束简化了自定义路由约束的使用。
注册路线
在不使用自定义约束的情况下注册路线的示例
app.UseMvc(routes => { routes.MapRoute( name: "default", template: "api/{culture::regex(^[a-z]{{2}}-[A-Za-z]{{4}}$)}}/{controller}/{id?}"); routes.MapRoute( name: "default", template: "api/{controller}/{id?}"); });