![](/img/trans.png)
[英]What's the difference between IRequestCultureFeature and CurrentCulture in Asp.Net Core?
[英]HttpContext.Current.Features.Get<IRequestCultureFeature>() is null in asp.net Core
我正在尝试从 ASP.NET Core 1.1 中的用户类获取当前文化。
我在Startup.cs 的ConfigureServices
下有以下内容:
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCultures = new List<CultureInfo>
{
new CultureInfo("en-US"),
new CultureInfo("fil-PH")
};
options.DefaultRequestCulture = new RequestCulture(culture: "en-US", uiCulture: "en-US");
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
});
我在Startup.cs 中的Configure
下有以下内容:
IHttpContextAccessor httpContextAccessor = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
Extensions.Context.Configure(httpContextAccessor);
IOptions<RequestLocalizationOptions> localizationOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
app.UseRequestLocalization(localizationOptions.Value);
我有以下用户类:
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Localization;
using System;
using System.Globalization;
namespace Framework.Extensions
{
public class Context
{
public HttpContext Current { get; set; }
public Uri AbsoluteUri { get; set; }
public string AbsolutePath { get; set; }
public string Url { get; set; }
public CultureInfo Culture { get; set; }
private static IHttpContextAccessor HttpContextAccessor;
public static void Configure(IHttpContextAccessor httpContextAccessor)
{
HttpContextAccessor = httpContextAccessor;
}
public Context()
{
Current = HttpContextAccessor.HttpContext;
AbsoluteUri = GetAbsoluteUri();
AbsolutePath = GetAbsoluteUri().AbsolutePath;
Url = GetAbsoluteUri().ToString();
Culture = GetCultureInfo();
}
private Uri GetAbsoluteUri()
{
UriBuilder uriBuilder = new UriBuilder();
uriBuilder.Scheme = Current.Request.Scheme;
uriBuilder.Host = Current.Request.Host.Host.ToString();
if (Current.Request.Host.Port != null)
{
uriBuilder.Port = Current.Request.Host.Port ?? default(int);
}
uriBuilder.Path = Current.Request.Path.ToString();
uriBuilder.Query = Current.Request.QueryString.ToString();
Uri absoluteUri = uriBuilder.Uri;
return uriBuilder.Uri;
}
private CultureInfo GetCultureInfo() {
IFeatureCollection requestFeatures = Current.Features; /* POPULATED */
RequestCultureFeature requestCultureFeature = requestFeatures.Get<RequestCultureFeature>(); /* NULL */
RequestCulture requestCulture = requestCultureFeature.RequestCulture;
return requestCulture.Culture;
}
}
}
纵观GetCultureInfo()
方法, Current
看来是正确与信息填充,因为我能看到的东西,如主机和端口等Features
也是人口-至少不为空。 但是在 Features 上调用Get<RequestCultureFeature>()
是空的?
关于为什么这会是空的以及如何解决它的任何想法?
我试图访问它的原因是为了获取 CurrentUICulture。
尝试使用IOptions<RequestLocalizationOptions>
在Context
类中创建参数化构造函数,一旦您在Startup.cs
ConfigureServices
内为依赖注入服务注册了RequestLocalizationOptions
,框架就会将注册的实例提供到Context
类中。
正如您建议在此处结束我们的评论,以防万一它对其他人也有用。
如果您的 UseRequestLocalization() 在调用 UseMvc() 之后出现,请尝试在 UseMvc() 之前调用 UseRequestLocalization() 。 并使用以下代码
var requestCulture = Context.Features.Get<IRequestCultureFeature>();
看起来您没有注册RequestLocalizationMiddleware
中间件:
app.UseRequestLocalization()
是应该添加中间件的扩展方法,它将为您设置功能。
@shikyo提供了最初问题的正确答案:
Get<RequestCultureFeature>()
为null
的原因是因为您需要使用Get<IRequestCultureFeature>()
接口而不是实现。
@ Siva-Gopal的答案有一定道理,但结果略有不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.