Как Response.Cookies.Append() в ASP.Net Core 1.1?

Я пытаюсь добавить глобализацию в приложение для интрасети, используя файл cookie, чтобы пользователи могли выбирать культуру. Промежуточное программное обеспечение настроено и работает, но я столкнулся с проблемой добавления файла 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. LocalRedirect не существует

Я пытался:

  1. HttpResponse, HttpRequest
  2. LocalRedirectResult

person K7Buoy    schedule 01.02.2017    source источник
comment
У вас есть этот код внутри контроллера или он находится где-то отдельно?   -  person DavidG    schedule 01.02.2017
comment
Возможный дубликат файлов cookie и ASP.NET Core   -  person Michael Freidgeim    schedule 27.09.2017


Ответы (3)


Из документов, где вы получили этот пример, видно, что код получен из 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);
    }
}
person DavidG    schedule 01.02.2017
comment
Контроллер... не класс. Это была глупая ошибка, большое спасибо! - person K7Buoy; 01.02.2017

В ASP .NET Core 2.1+, если вы используете функцию политики файлов cookie для реализации GDPR, вызывая app.UseCookiePolicy() в Startup.cs, обязательно пометьте файл cookie как необходимый, иначе он не будет отправлен пользователям, которые не приняли вашу политику.

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

Очевидно, вы также должны упомянуть файл cookie в своем заявлении о конфиденциальности.

person Alvin Stanescu    schedule 02.10.2018
comment
Отличное время. Просто начинаю работу над новым приложением в версии 2.1, возможно, скоро в версии 2.2, и я думаю, что вскоре столкнусь с этим. - person K7Buoy; 05.10.2018

Прежде всего, вы должны использовать 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}");
    });
}
person Dawid Rutkowski    schedule 01.02.2017
comment
Это вообще не отвечает на вопрос. - person DavidG; 01.02.2017
comment
И как предоставленный вами код позволяет пользователю переключать культурные предпочтения? - person DavidG; 01.02.2017
comment
Код, который я предоставил, показывает конфигурацию, которую я использую, чтобы использовать точно такое же действие, как и в вопросе. Я также упомянул в первом абзаце, что... действие, которое вы имеете в примере, должно работать просто отлично... если конфигурация будет правильной. - person Dawid Rutkowski; 01.02.2017
comment
Спасибо за публикацию этого кода. Я обновил свой вопрос, включив в него элементы запуска. Я никоим образом не занимаюсь локализацией, поэтому у меня нет файлов .resx для включения, но я думаю, что мы очень похожи. Интересно, что вы используете Microsoft.AspNetCore.Localization.RequestCulture() по умолчанию. - person K7Buoy; 01.02.2017