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。
看起来您没有注册RequestLocalizationMiddleware中间件:
app.UseRequestLocalization()是应该添加中间件的扩展方法,它将为您设置功能。
Context尝试在类中创建参数化构造函数,一旦您在中IOptions<RequestLocalizationOptions>注册了RequestLocalizationOptions依赖注入服务,框架就会将注册的实例提供到类中。ConfigureServicesStartup.csContext
正如您建议在此处结束我们的评论,以防它对其他人也有用。
| 归档时间: |
|
| 查看次数: |
11584 次 |
| 最近记录: |