如何处理每个请求的会话Asp.net mvc

如何处理每个请求的会话Asp.net mvc,asp.net,asp.net-mvc-4,session,session-variables,session-state,Asp.net,Asp.net Mvc 4,Session,Session Variables,Session State,我有一个web应用程序在移动应用程序(WebView)中运行。当用户打开应用程序时,移动应用程序通过请求向我发送电话的语言信息。由于语言值仅在第一次请求时出现,然后被删除,因此我必须将其保存起来以备后续请求使用。我已经在global.asax上尝试了PreRequestHandlerExecute和Application_AcquisiteRequestState。我控制会议。如果为null,我从请求中获取值,如果不为null,我从会话中获取值。但会话似乎总是空的,并且总是从请求中获取值。有什么

我有一个web应用程序在移动应用程序(WebView)中运行。当用户打开应用程序时,移动应用程序通过请求向我发送电话的语言信息。由于语言值仅在第一次请求时出现,然后被删除,因此我必须将其保存起来以备后续请求使用。我已经在global.asax上尝试了PreRequestHandlerExecute和Application_AcquisiteRequestState。我控制会议。如果为null,我从请求中获取值,如果不为null,我从会话中获取值。但会话似乎总是空的,并且总是从请求中获取值。有什么想法会很有帮助吗?谢谢你提前通知

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

按照您的代码,您总是进入第一条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,而不是存储CultureInfo。

这是一个MVC web应用程序吗?如果是这样,您可以尝试将该值保存在
Controller.TempData

因此,不要做
this.Session[“culture”]=ci
您将添加到TempData属性
TempData.add(“区域性”,ci)。这将使区域性可用于下一个请求。您只需要确保在每个请求中重新添加
ci
值,以使该值在您需要的时间内保持不变


TempDataDictionary的文档:

这是由于web.config中的设置

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


我试图保护cookie,但它阻止会话。我删除了它,现在一切正常。但我仍然需要找到一种方法来保护cookies。

不,实际上我不是。如上所述;“languageCode”变量仅在第一次请求时存在。之后它是空的。这就是为什么我需要保持会议。在第一次请求之后,因为我无法获得“语言代码”,我需要从会话访问它。仍然认为if语句看起来有问题。然而,在会话中只存储langName而不是CultureInfo可能是明智的,而CulrureInfo是可序列化的,最好保持较小的规模。您能确认您的会话配置是否正确吗?TempData由会话支持,并且由于OP希望在后续请求中使用它,我建议会话是合适的方法,而不是TempData,这更像是在故障后良好点后返回错误消息。我想我是在尝试提供一种可能的解决方法,因为OP指出尝试访问HttpContext.Current.Session始终返回null。