【问题标题】:How to Response.Cookies.Append() in ASP.Net Core 1.1?如何在 ASP.Net Core 1.1 中使用 Response.Cookies.Append()?
【发布时间】:2017-06-18 02:40:51
【问题描述】:

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

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

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. Lo​​calRedirect 不存在

我试过了:

  1. HttpResponse、HttpRequest
  2. Lo​​calRedirectResult

【问题讨论】:

标签: c# cookies globalization asp.net-core-1.1


【解决方案1】:

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

【讨论】:

  • 这根本不能回答问题。
  • 您提供的代码如何允许用户切换文化偏好?
  • 我提供的代码显示了我用来使用与问题中完全相同的操作的配置。我还在第一段中提到“......您在示例中的操作应该可以正常工作......”如果配置正确的话。
  • 感谢您发布该代码。我已经更新了我的问题以包括我的启动元素。我无论如何都没有进行本地化,所以没有要包含的 .resx 文件,但我认为我们非常相似。有趣的是,您默认使用 Microsoft.AspNetCore.Localization.RequestCulture()。
【解决方案2】:

从您获得该示例的文档中,您可以看到代码来自 GitHub,其中包含许多示例项目。这个特定的样本来自Localization.StarterWeb

您的两个“缺失”方法实际上是 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);
    }
}

【讨论】:

  • 控制器...不是类。这是一个愚蠢的错误,非常感谢!
【解决方案3】:

在 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。

【讨论】:

  • 好时机。刚刚开始在 2.1 中开发一个新应用程序,也许很快就会有 2.2 版,我想很快就会遇到这个问题。
猜你喜欢
  • 1970-01-01
  • 2017-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-22
  • 2017-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多