- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试覆盖当前请求的文化。我使用自定义 ActionFilterAttribute
部分工作.
public sealed class LanguageActionFilter : ActionFilterAttribute
{
private readonly ILogger logger;
private readonly IOptions<RequestLocalizationOptions> localizationOptions;
public LanguageActionFilter(ILoggerFactory loggerFactory, IOptions<RequestLocalizationOptions> options)
{
if (loggerFactory == null)
throw new ArgumentNullException(nameof(loggerFactory));
if (options == null)
throw new ArgumentNullException(nameof(options));
logger = loggerFactory.CreateLogger(nameof(LanguageActionFilter));
localizationOptions = options;
}
public override void OnActionExecuting(ActionExecutingContext context)
{
string culture = context.RouteData.Values["culture"]?.ToString();
if (!string.IsNullOrWhiteSpace(culture))
{
logger.LogInformation($"Setting the culture from the URL: {culture}");
#if DNX46
System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo(culture);
System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture);
#else
CultureInfo.CurrentCulture = new CultureInfo(culture);
CultureInfo.CurrentUICulture = new CultureInfo(culture);
#endif
}
base.OnActionExecuting(context);
}
}
LanguageActionFilter
.
[ServiceFilter(typeof(LanguageActionFilter))]
[Route("api/{culture}/[controller]")]
public class ProductsController : Controller
{
...
}
{culture}
在每个 Controller 上,因为我将在每条路线上都需要它。 [Route("api/{culture=en-US}/[controller]")]
出于显而易见的原因。 app.UseMvc( routes =>
{
routes.MapRoute(
name: "DefaultRoute",
template: "api/{culture=en-US}/{controller}"
);
});
IRequestCultureProvider
中调查过实现并将其添加到
UseRequestLocalization
方法如
app.UseRequestLocalization(new RequestLocalizationOptions
{
RequestCultureProviders = new List<IRequestCultureProvider>
{
new UrlCultureProvider()
},
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")
}
}, new RequestCulture("en-US"));
api/en-us/products
正如我们
api/products
应该路由到同一个 Controller ,前者不会改变文化。
Accept-Language
标题。 UseRequestLocalization
完成这有效。此外,我不喜欢当前的方法必须为每个 Controller 添加两个属性(
{culture}
路由和
[ServiceFilter(typeof(LanguageActionFilter))]
)。
SupportedCultures
中的一组。
RequestLocalizationOptions
的属性(property)传递给
UseRequestLocalization
.
IOptions<RequestLocalizationOptions> localizationOptions
在
LanguageActionFilter
上面不起作用,因为它返回了
RequestLocalizationOptions
的新实例哪里
SupportedCultures
总是
null
而不是传递给的那个。
最佳答案
更新 ASP.Net Core 1.1
全新 RouteDataRequestCultureProvider
将作为 1.1 release 的一部分推出,希望这意味着您不必再创建自己的请求提供程序。您可能仍然会发现此处的信息很有用(例如路由位),或者您可能对创建自己的请求文化提供程序感兴趣。
您可以创建 2 条路由,让您可以在 url 中有和没有文化段的情况下访问端点。两者 /api/en-EN/home
和 /api/home
将被路由到家庭 Controller 。 (因此 /api/blah/home
不会将路由与文化匹配,并且会得到 404,因为 blah Controller 不存在)
为了使这些路由起作用,包含culture参数的路由具有更高的优先级,并且culture参数包含一个正则表达式:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "apiCulture",
template: "api/{culture:regex(^[a-z]{{2}}-[A-Z]{{2}}$)}/{controller}/{action=Index}/{id?}");
routes.MapRoute(
name: "defaultApi",
template: "api/{controller}/{action=Index}/{id?}");
});
[Route("api/{language:regex(^[[a-z]]{{2}}-[[A-Z]]{{2}}$)}/[controller]")]
[Route("api/[controller]")]
public class BaseApiController: Controller
{
}
public class ProductController : BaseApiController
{
//This will bind to /api/product/1 and /api/en-EN/product/1
[HttpGet("{id}")]
public IActionResult GetById(string id)
{
return new ObjectResult(new { foo = "bar" });
}
}
"Microsoft.AspNet.Mvc.WebApiCompatShim": "6.0.0-rc1-final"
services.AddMvc().AddWebApiConventions();
ApiController
,这是由 shim 包 routes.MapWebApiRoute("apiLanguage",
"api/{language:regex(^[a-z]{{2}}-[A-Z]{{2}}$)}/{controller}/{id?}");
routes.MapWebApiRoute("DefaultApi",
"api/{controller}/{id?}");
IApplicationModelConvention
它负责将文化前缀添加到您的属性路由。这超出了这个问题的范围,但我已经实现了这个想法 localization article IRequestCultureProvider
它将查看请求 url 并从那里提取文化(如果提供)。
Once you upgrade to ASP .Net Core 1.1 you might avoid manually parsing the request url and extract the culture segment.
I have checked the implementation of
RouteDataRequestCultureProvider
in ASP.Net Core 1.1, and they use an HttpContext extension methodGetRouteValue(string)
for getting url segments inside the request provider:culture = httpContext.GetRouteValue(RouteDataStringKey)?.ToString();
However I suspect (I haven't had a chance to try it yet) that this would only work when adding middleware as MVC filters. That way your middleware runs after the Routing middleware, which is the one adding the
IRoutingFeature
into the HttpContext. As a quick test, adding the following middleware before UseMvc will get you no route data:app.Use(async (context, next) =>
{
//always null
var routeData = context.GetRouteData();
await next();
});
IRequestCultureProvider
你只需要:
public class UrlCultureProvider : IRequestCultureProvider
{
public Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext)
{
var url = httpContext.Request.Path;
//Quick and dirty parsing of language from url path, which looks like "/api/de-DE/home"
//This could be skipped after 1.1 if using the middleware as an MVC filter
//since you will be able to just call the method GetRouteValue("culture")
//on the HttpContext and retrieve the route value
var parts = httpContext.Request.Path.Value.Split('/');
if (parts.Length < 3)
{
return Task.FromResult<ProviderCultureResult>(null);
}
var hasCulture = Regex.IsMatch(parts[2], @"^[a-z]{2}-[A-Z]{2}$");
if (!hasCulture)
{
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")
}
};
//Insert this at the beginning of the list since providers are evaluated in order until one returns a not null result
localizationOptions.RequestCultureProviders.Insert(0, new UrlCultureProvider());
//Add request localization middleware
app.UseRequestLocalization(localizationOptions, new RequestCulture("en-US"));
关于routes - 可选择通过 ASP.NET Core 1.0 应用程序中的 url/route 覆盖请求区域性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35829426/
假设我拥有域 mydomain.com,并且我在服务器上有一个 Web 应用程序,网址为 http://99.99.99.99:1234/MyApplication/startpage.somethi
我正在尝试通过以下方式更新已解析的 URL: u, _ := url.Parse(s) if u.Scheme == "" { u.Scheme = "https" } if u.Path =
如何将 www.somesite.com/api(.*) 映射到 www.somesite.com/$1:9000? (我需要将/api 映射到运行 @ 端口 9000 的 Play 框架应用程序)
我有一个资源结构,如航类 > 座位 > 预订,所以预订属于某个航类的某个座位: http://example.com/jdf_3prGPS4/1/jMBDy46PbNc
我想知道以下网址是否有效。 路径中的点,在主机之后: http://www.example.com/v.b.w..com 主机中的点,作为子域的一部分: http://v.b.w..co.manufa
我有两个域 - crmpicco.co.uk 和 ayrshireminis.com - 如果我浏览到: www.crmpicco.co.uk/mini/new我希望能够重定向到 www.ayrshi
我正在尝试使用 URL 重写和应用程序请求路由来重写到外部 URL。我设置了以下规则: 在规则中,“patternToMatch”是我试
我已经安装了带有 SharePoint 和 Url Rewrite 模块的 IIS 7.0。 是以下句子还是我配置错误才能看到这个结果? Url Redirect 可以将 url 重定向到任何内部(在
我想知道,为了获得良好的 SEO,您必须在 URL 中使用自然语言。您知道字符中单词或短语的最大大小吗?例如: www.me.com/this-is-a-really-long-url.htm 我问这
有人知道在 SEO 友好 URL 中使用逗号有什么问题吗?我正在使用一些在其 SEO 友好 URL 中使用大量逗号的软件;但我 100% 肯定我见过一些程序/平台无法正确识别 URL 并在第一个逗号后
我有一个网站,我正在为所有链接使用干净的 URL。我想知道对于简短的基本 URL 与较长的描述性 URL 有何看法。 例如,如果我的网站是关于 Georgia Bulldog 足球新闻的,那么哪个网站
我正在编写一个类似于 tinyurl 的 URL 缩短器,我想知道如何跟踪已经使用我的服务缩短的 URL?例如,tinyurl 为相同的长 URL 生成相同的小 URL,而不管是谁创建的。如
我是 magento 的新手。我正在开发一个模块。为此,我有一些要显示链接的 css 和 js 文件。我目前有类似 的链接 getSkinUrl('module_tryouts/css/jquery.
我想基于 HTTP_URL 重写 URL 以重定向到不同的端口,同时保留其余的 URL 和查询字符串(如果指定)。例如, http://host/john/page.aspx 应该重定向到 http:
我遇到了以下问题: 我的 Grails (2.2.0) 应用程序具有以下 URL 映射: "/api/clientQuote/$labcode/$cliCode/$quoCode"(controlle
我有一个很长的 URL,它不适合 URL 字段。它一直在修剪。该怎么办?有没有办法增加 SharePoint 2010 中的 URL 字段字符限制? 或者解决方法来容纳长 URL。例如,以下 URL
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 9年前关闭。 Improve this que
我们从客户以前的开发人员那里继承了相当多的 Google Apps 脚本项目。 Apps 脚本通过嵌入式小部件部署在 Google 网站 (sites.google.com) 的各个页面上。每当我们需
我正在编写一些文档,但遇到了一些词汇问题: http://www.example.com/en/public/img/logo.gif 被称为“绝对”网址,对吗? ../../public/img/l
我们从客户以前的开发人员那里继承了相当多的 Google Apps 脚本项目。 Apps 脚本通过嵌入式小部件部署在 Google 网站 (sites.google.com) 的各个页面上。每当我们需
我是一名优秀的程序员,十分优秀!