Как обрабатывать сессии на каждый запрос Asp.net MVC - PullRequest
2 голосов
/ 23 октября 2019

У меня запущено веб-приложение в мобильном приложении (WebView). Когда пользователь открывает приложение, мобильное приложение отправляет мне информацию о языке телефона через запрос. Поскольку значение языка приходит только при первом запросе, а затем удаляется, я должен взять его и сохранить для последующих запросов. Я пробовал PreRequestHandlerExecute и Application_AcquireRequestState на global.asax. Я контролирую сессию. если оно равно нулю, я получаю значение из запроса, если оно не равно нулю, я получаю его из сеанса. Но кажется, что сессия всегда пуста и всегда получает значение из запроса. Любая идея будет очень полезна? Спасибо за продвижение.

var dilKodu = Request.Headers.GetValues("languageCode");

        CultureInfo ci;
        if (dilKodu != null)
        {

            //I set culture from request if it is not null.
            ci = new CultureInfo(dilKodu[0].ToString());
            this.Session["Culture"] = ci;
        }
        else
        {
            if (HttpContext.Current.Session != null)
            {
                //I get culture from Session if its set before.
                ci = (CultureInfo)this.Session["Culture"];

                if (ci == null)
                {
                    string langName = "tr";
                    //If culture exist neither Session nor Request

                    ci = new CultureInfo(langName);
                    this.Session["Culture"] = ci;
                }
            }
            else
            {

                ci = new CultureInfo("tr");
            }

        }

        Thread.CurrentThread.CurrentUICulture = ci;
        Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(ci.Name);

Ответы [ 3 ]

0 голосов
/ 23 октября 2019

Это веб-приложение MVC? Если это так, вы можете попытаться сохранить значение в свойстве Controller.TempData .

Так что вместо выполнения this.Session["culture"] = ci; вы добавите свойство TempData TempData.Add("culture", ci);. Это сделает культуру доступной для следующего запроса. Вам просто нужно убедиться, что вы добавляете значение ci в каждый запрос, чтобы оно сохранялось столько времени, сколько вам нужно.

Документация для TempDataDictionary: https://docs.microsoft.com/en-us/dotnet/api/system.web.mvc.tempdatadictionary?view=aspnet-mvc-5.2

0 голосов
/ 24 октября 2019

Это было связано с настройкой в ​​файле web.config.

<httpCookies requireSSL="true" httpOnlyCookies="true"/>

Я пытался защитить cookie, но он предотвращал сеансы. Я удаляю его, и теперь все работает просто отлично. Но мне все еще нужно найти способ обезопасить куки.

0 голосов
/ 23 октября 2019

Исходя из своего кода, вы всегда переходите к первому оператору if, который будет читать и задавать форму кода dilKodu

Ваш код должен быть больше похож на этот

if (HttpContext.Current.Session != null)
{
  ci = (CultureInfo) this.Session["Culture"];
  if (ci == null)
  {
    var langName = Request.Headers.GetValues("languageCode");
    Session["dilG"] = langName;
    ci = new CultureInfo(langName);
    Session["Culture"] = ci;
  }
}
else
{
  Session["dilG"] = "session hazır değil tr yapıldı";
  ci = new CultureInfo("tr");
}

В основному вас операторы if неправильно настроены для того, что вы пытаетесь сделать.

Также может быть целесообразно сохранить ваши объекты сеанса маленькими, то есть просто сохранить langName в сеансе и каждый раз создавать из него CultureInfoчем хранить КультураИнфо.

...