zoukankan      html  css  js  c++  java
  • asp.net core api路由及多语言切换的实现

    预期目标:https://myweb.com/zh-CN/api/post、https://myweb.com/en-US/api/post

    即通过地址实现多语言切换。

    在startup.cs中配置:

     1 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
     2         {
     3             if (env.IsDevelopment())
     4             {
     5                 app.UseDeveloperExceptionPage();
     6             }
     7 
     8             app.UseHttpsRedirection();
     9 
    10             app.UseRouting();
    11 
    12             app.UseAuthorization();
    13 
    14             app.UseStaticFiles();
    15 
    16             CultureInfo[] supportedCultures = new[]
    17             {
    18                 new CultureInfo("en"),
    19                 new CultureInfo("zh-CN")
    20             };
    21 
    22             var options = new RequestLocalizationOptions();
    23             options.DefaultRequestCulture = new RequestCulture("en");
    24             options.SupportedCultures = supportedCultures;
    25             options.SupportedUICultures = supportedCultures;
    26 
    27             options.RequestCultureProviders.Insert(0, new RouteDataRequestCultureProvider { Options = options });
    28 
    29             app.UseRequestLocalization(options);//一定要放在这个位置
    30 
    31             app.UseEndpoints(endpoints =>
    32             {
    33                 //endpoints.MapControllers();
    34                 endpoints.MapControllerRoute(name: "default", pattern: "~/{culture}/{controller}/{action}");
    35             });
    36         }

    采用MapControllerRoute配置路由则无需再为controler及其action配置属性路由,controler及其action会自动根据MapControllerRoute配置的共享路由配置自己的路由。如果仍然给controler及其action配置了属性路由,则系统则以ontroler及其action的属性路由为准。换句话说,MapControllerRoute配置的路由是共享路由,controler及其action配置的路由是针对单个controler及其action的个性化路由。个性化路由优先于共享路由。

    RouteDataRequestCultureProvider是实现地址栏多语言切换的重要类,配合endpoints.MapControllerRoute的{culture}参数设置即可实现目标,它会根据路由规则自动读取地址栏对应的culture值设置为当前的cultureInfo。

    上面的代码通过下面的方式修改,可以达到相同效果。

    把16行到27行的代码定义到ConfigureServices(IServiceCollection services)方法中:

     1 public void ConfigureServices(IServiceCollection services)
     2         {
     3             CultureInfo[] supportedCultures = new[]
     4            {
     5              new CultureInfo("en"),
     6              new CultureInfo("zh-CN")
     7             };
     8 
     9             services.Configure<RequestLocalizationOptions>(options =>
    10             {
    11                 options.DefaultRequestCulture = new RequestCulture("en");
    12                 options.SupportedCultures = supportedCultures;
    13                 options.SupportedUICultures = supportedCultures;
    14 
    15                 options.RequestCultureProviders.Insert(0, new RouteDataRequestCultureProvider { Options = options });
    16             });
    17 
    18             
    19             services.AddControllers();
    20         }

    然后把第一段代码的16到29行改为:

    app.UseRequestLocalization();

    即可。效果是一样的!

  • 相关阅读:
    为什么GNU grep如此之快?
    在百度nlp实习一个月时间里用到的shell操作
    InfoPi简介、试用链接、资料索引
    自定义worker的方法,及一例
    2017.1.9版给信息源新增:max_len、max_db字段
    手把手写一个html_json信息源
    定义信息源的一些示例(xml文件)
    启用https协议的方法
    安装第三方Python模块,增加InfoPi的健壮性
    更新日志(建议升级到2017.1.18a) && 更新程序的方法
  • 原文地址:https://www.cnblogs.com/qingyun163/p/15526492.html
Copyright © 2011-2022 走看看