C# 如何在ASP.NETCore1.1中响应.Cookies.Append()?
我正在尝试将全球化添加到Intranet应用程序中,使用cookie允许用户选择区域性偏好。中间件已设置并正在运行,但我遇到了一个问题,即根据用户界面选择附加到cookie 该方法直接来自Asp.Net核心文档,如下所示:C# 如何在ASP.NETCore1.1中响应.Cookies.Append()?,c#,cookies,globalization,asp.net-core-1.1,C#,Cookies,Globalization,Asp.net Core 1.1,我正在尝试将全球化添加到Intranet应用程序中,使用cookie允许用户选择区域性偏好。中间件已设置并正在运行,但我遇到了一个问题,即根据用户界面选择附加到cookie 该方法直接来自Asp.Net核心文档,如下所示: public void ConfigureServices(IServiceCollection services) { services.Configure<RequestLocalizationOptions>( options =&g
public void ConfigureServices(IServiceCollection services)
{
services.Configure<RequestLocalizationOptions>(
options =>
{
var supportedCultures = new List<CultureInfo>
{
new CultureInfo("en-US"),
new CultureInfo("en-GB"),
new CultureInfo("fr-FR"),
new CultureInfo("es-ES")
};
options.DefaultRequestCulture = new RequestCulture(culture: "en-GB", uiCulture: "en-GB");
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
});
services.AddLocalization();
services.AddMvc(config =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
config.Filters.Add(new AuthorizeFilter(policy));
})
.AddViewLocalization();
services.AddSession(options => {
options.CookieName = "Intranet";
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
var locOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
app.UseRequestLocalization(locOptions.Value);
app.UseSession();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
[HttpPost]
public IActionResult SetLanguage(string culture, string returnUrl)
{
Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1)
});
return LocalRedirect(returnUrl);
}
public void配置服务(IServiceCollection服务)
{
服务。配置(
选项=>
{
var supportedCultures=新列表
{
新文化信息(“美国”),
新文化信息(“en GB”),
新文化资讯(“fr”),
新文化信息(“es”)
};
options.DefaultRequestCulture=新的RequestCulture(区域性:“en-GB”,uiCulture:“en-GB”);
options.SupportedCultures=SupportedCultures;
options.supportedCultures=supportedCultures;
});
services.AddLocalization();
services.AddMvc(配置=>
{
var policy=new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()文件
.Build();
config.Filters.Add(新的授权过滤器(策略));
})
.AddViewLocalization();
services.AddSession(选项=>{
options.CookieName=“内部网”;
});
}
公共void配置(IApplicationBuilder应用程序、IHostingEnvironment环境、iLogger工厂)
{
var locOptions=app.ApplicationServices.GetService();
app.UseRequestLocalization(locOptions.Value);
app.UseSession();
app.UseMvc(路由=>
{
routes.MapRoute(
名称:“默认”,
模板:“{controller=Home}/{action=Index}/{id?}”);
});
}
[HttpPost]
公共IActionResult集语言(字符串区域性、字符串返回URL)
{
Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookiierRequestCultureProvider.MakeCookieValue(新请求文化(文化)),
新CookieOptions{Expires=DateTimeOffset.UtcNow.AddYears(1)
});
返回LocalRedirect(returnUrl);
}
这些问题是:
首先,你必须使用。后面一个例子中的操作应该可以正常工作。 我还要补充一点:
CultureInfo.CurrentCulture = culture;
CultureInfo.CurrentUICulture = culture;
这是我的配置:
public void ConfigureServices(IServiceCollection services)
{
services.AddLocalization(opts => { opts.ResourcesPath = "Resources"; });
services.AddMvc()
.AddViewLocalization(
Microsoft.AspNetCore.Mvc.Razor.LanguageViewLocationExpanderFormat.SubFolder,
opts => { opts.ResourcesPath = "Resources"; }
)
.AddDataAnnotationsLocalization();
services.Configure<RequestLocalizationOptions>(opts =>
{
var supportedCultures = new[]
{
new CultureInfo("en-US"),
...
};
opts.DefaultRequestCulture = new Microsoft.AspNetCore.Localization.RequestCulture("en-US");
opts.SupportedCultures = supportedCultures;
opts.SupportedUICultures = supportedCultures;
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseRequestLocalization();
app.UseMvc(routes =>
{
routes.MapRoute(name: "default", template: "{controller=Home}/{action=Index}");
});
}
public void配置服务(IServiceCollection服务)
{
AddLocalization(opts=>{opts.ResourcesPath=“Resources”;});
services.AddMvc()
.AddViewLocalization(
Microsoft.AspNetCore.Mvc.Razor.LanguageViewLocationExpandPerformat.SubFolder,
opts=>{opts.ResourcesPath=“Resources”;}
)
.AddDataAnnotationsLocalization();
services.Configure(选项=>
{
var supportedCultures=new[]
{
新文化信息(“美国”),
...
};
opts.DefaultRequestCulture=new Microsoft.AspNetCore.Localization.RequestCulture(“en-US”);
opts.SupportedCultures=SupportedCultures;
opts.supporteduccultures=支持的文化;
});
}
公共void配置(IApplicationBuilder应用程序、IHostingEnvironment环境、iLogger工厂)
{
app.UseRequestLocalization();
app.UseMvc(路由=>
{
MapRoute(名称:“默认”,模板:{controller=Home}/{action=Index});
});
}
从您获得该示例的文档中,您可以看到该代码来自许多示例项目。这个特别的样品来自中国
您的两个“缺失”方法实际上是ControllerBase
的一部分(这是Controller
继承的。因此,如果您将此操作方法放入控制器中,它将起作用
public class HomeController : Controller
{
[HttpPost]
public IActionResult SetLanguage(string culture, string returnUrl)
{
Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) }
);
return LocalRedirect(returnUrl);
}
}
在ASP.NET Core 2.1+中,如果通过调用
Startup.cs
中的app.UseCookiePolicy()
来使用cookie策略功能来实现GDPR,请确保将cookie标记为必需,否则它将不会发送给未接受您的策略的用户
Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
new CookieOptions
{
Expires = DateTimeOffset.UtcNow.AddYears(1),
IsEssential = true
}
);
显然,您还应该在您的隐私声明中提到cookie。这根本不能回答问题。您提供的代码如何允许用户切换区域性首选项?我提供的代码显示的配置与问题中使用的配置完全相同。我在中也提到了第一段:“…您在示例中的操作应该可以正常工作…”如果配置正确。感谢您发布该代码。我已更新了我的问题,以包含我的启动元素。我没有在中进行本地化,因此没有要包含的.resx文件,但我认为我们非常相似。有趣的是,您使用的是Microsoft.AspNetCore.Localization.RequestCulture()默认情况下。你是在一个控制器中有代码,还是在其他地方是独立的?可能是控制器的副本…而不是类。这是一个愚蠢的错误,非常感谢!非常好的时机。刚刚开始在2.1中开发一个新的应用程序,可能很快就会在2.2中出现,我想很快就会遇到这个问题。