如何在 ASP.Net Core 1.1 中使用 Response.Cookies.Append()?

How to Response.Cookies.Append() in ASP.Net Core 1.1?

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

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

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

问题是:

  1. 响应不存在
  2. 本地重定向不存在

我试过:

  1. HttpResponse、HttpRequest
  2. LocalRedirectResult

首先你必须使用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<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}");
    });
}

从您获得该示例的文档中,您可以看到代码来自 GitHub with lots of sample projects. This particular sample comes from Localization.StarterWeb

你的两个"missing"方法实际上是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。