繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM