如何在ASP.Net Core 1.1中响应.Cookies.Append()?

我正在尝试将Globalization添加到Intranet应用程序,使用cookie来允许用户使用文化偏好。 中间件已设置并运行但我遇到了基于UI选择附加到cookie的问题。

该方法直接来自Asp.Net Core文档,如下所示:

public void ConfigureServices(IServiceCollection services) { services.Configure( options => { var supportedCultures = new List { 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>(); 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); } 

问题是:

  1. 响应不存在
  2. LocalRedirect不存在

我试过了:

  1. HttpResponse,HttpRequest
  2. LocalRedirectResult

从您获得该示例的文档中,您可以看到代码来自GitHub,其中包含大量示例项目。 此特定示例来自Localization.StarterWeb 。

你的两个“缺失”方法实际上是ControllerBase一部分(这是Controllerinheritance的。所以如果你把这个动作方法放到一个控制器中,它就会起作用。

 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策略function来实现GDPR,请确保将您的cookie标记为必需,否则它将不会被发送给具有避风港的用户不接受你的政策。

 Response.Cookies.Append( CookieRequestCultureProvider.DefaultCookieName, CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)), new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1), IsEssential = true } ); 

显然,您还应该在隐私声明中提及cookie。

首先,您要使用CookieRequestCultureProvider 。 稍后您在示例中执行的操作应该可以正常工作。 我还想补充一点:

 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(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}"); }); }