HttpContext.Current.Features.Get<IRequestCultureFeature>() 在 Core 中为 null asp.net



我正在尝试从Core 1.1中的用户类中获取当前文化 ASP.NET。

我在Startup .csConfigureServices下有以下内容:

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 .csConfigure下有以下内容:

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也会填充 - 至少不为空。 但是在功能上调用Get<RequestCultureFeature>()是空的?

关于为什么这将是空的,以及如何解决它的任何想法?

我尝试访问它的原因是获取CurrentUICulture。

看起来您没有注册RequestLocalizationMiddleware中间件:

app.UseRequestLocalization()是应该添加中间件的扩展方法,它将为您设置功能。

尝试使用IOptions<RequestLocalizationOptions>在类Context创建一个参数化构造函数,一旦您在Startup.csConfigureServices中注册了依赖项注入服务的RequestLocalizationOptions,框架会将注册的实例提供给Context类。

正如您建议在这里结束我们的评论,以防万一它对其他人也有用。

如果你的UseRequestLocalization()是在调用UseMvc()之后出现的 尝试在 UseMvc() 之前调用 UseRequestLocalization()。 并使用以下代码

var requestCulture = Context.Features.Get<IRequestCultureFeature>();

最新更新