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

eat*_*ode 5 c# asp.net-core-mvc

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

ConfigureServices我在Startup.cs中有以下内容:

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;
});
Run Code Online (Sandbox Code Playgroud)

Configure我在Startup.cs中有以下内容:

IHttpContextAccessor httpContextAccessor = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
Extensions.Context.Configure(httpContextAccessor);

IOptions<RequestLocalizationOptions>  localizationOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
app.UseRequestLocalization(localizationOptions.Value);
Run Code Online (Sandbox Code Playgroud)

我有以下用户类别:

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

查看该GetCultureInfo()方法,Current似乎已正确填充信息,因为我可以看到主机和端口等内容 Features也已填充 - 至少不为空。但是调用Get<RequestCultureFeature>()Features却是null?

关于为什么这是空的以及如何解决它有什么想法吗?

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

Tim*_*Tim 7

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

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


Siv*_*pal 5

Context尝试在类中创建参数化构造函数,一旦您在中IOptions<RequestLocalizationOptions>注册了RequestLocalizationOptions依赖注入服务,框架就会将注册的实例提供到类中。ConfigureServicesStartup.csContext

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