Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用SessionStateBehavior.ReadOnly写入会话变量_C#_Asp.net_Asp.net Mvc_Http_Session - Fatal编程技术网

C# 使用SessionStateBehavior.ReadOnly写入会话变量

C# 使用SessionStateBehavior.ReadOnly写入会话变量,c#,asp.net,asp.net-mvc,http,session,C#,Asp.net,Asp.net Mvc,Http,Session,在我的ASP.NET MVC 5应用程序中,我对需要读取会话中存储的值的控制器内的方法执行GET请求。为了避免会话状态锁定问题,我在类级别将SessionStateBehavior设置为ReadOnly [SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)] public class TestController: Controller { var test = Session

在我的ASP.NET MVC 5应用程序中,我对需要读取会话中存储的值的控制器内的方法执行
GET
请求。为了避免会话状态锁定问题,我在类级别将
SessionStateBehavior
设置为
ReadOnly

 [SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]
    public class TestController: Controller
    {
         var test = Session["KEY"];
...
但是,偶尔,我需要将
会话
变量改写为同一方法中的其他变量。ASP.NET MVC不允许我在
SessionStateBehavior
设置为
ReadOnly
时执行此操作。我无法将其设置为
Required
,因为这样我又遇到了会话状态锁定问题,从而阻止了并发AJAX请求

有什么好的解决办法


编辑:我们正在使用SQL server进行会话状态管理。

如果您以.NET Framework 4.6.2为目标,并且您使用的是SQL server,则可以利用新服务器异步访问会话存储提供程序

下载并安装SessionStateModule和NuGet软件包

还可以考虑将会话状态存储在SQL Server数据库中

注意(来自评论)

尽管ASP.NET核心中的会话是非锁定的,但根据本文的说法,只有下一版本的
SqlSessionStateProviderAsync
才应该引入此功能

替代供应商 另一个不同的选择是使用:例如,对于Azure应用程序服务中的web应用程序,请遵循以下步骤。
更一般地说,在Redis服务器中,从不锁定会话

创建使用
DefaultControllerFactory
继承的customControllerFactory,并覆盖
GetControllerSessionBehavior()
。然后使用
ControllerBuilder.Current.SetControllerFactory()
在应用程序启动时注册工厂


请参见

因为您使用的是SQL Server会话后端,我认为您可以通过手动与会话数据库交互并使其符合您的意愿来实现所需

熟悉课程,尤其是课堂。在后台,它所做的只是(反)序列化数据并调用会话状态数据库中的存储过程(具体地说,签出)


如果您可以从通过
HttpContext
访问的会话集合以及您想要进行的任何更改中找出如何构造对象,或者更具体地说,找到构造对象所需的方法,那么您可以使用反射来调用内部静态方法。在此之后,调用正确的存储过程(基于更新的会话大小)应该很简单。

您可以为每个请求动态设置会话状态行为。根据某些条件,您可以切换到
sessionstatebhavior.Required
,在任何其他情况下,只需使用默认行为即可

您将需要一个自定义MvcRouteHandler:

public class MyMvcRouteHandler : MvcRouteHandler
{
    protected override SessionStateBehavior GetSessionStateBehavior(RequestContext requestContext)
    {
        if (someCondition)
        {
            return SessionStateBehavior.Required;
        }
        // fallback to default behavior
        return base.GetSessionStateBehavior(requestContext);
    }
}
requestContext
中,您将找到
HttpContext
,并在此基础上决定要做什么

您需要为每个必要的路线设置此新的
RouteHandler
。您可以在
RouteConfig
文件中执行此操作,将其放在路线注册之后:

// ...
routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
// ...

// set MyMvcRouteHandler for every route
foreach (var route in routes.OfType<Route>())
{
    route.RouteHandler = new MyMvcRouteHandler();
}
/。。。
routes.MapRoute(
名称:“默认”,
url:“{controller}/{action}/{id}”,
默认值:新建{controller=“Home”,action=“Index”,id=UrlParameter.Optional}
);
// ...
//为每个路由设置MyMvcRouteHandler
foreach(routes.OfType()中的var route)
{
route.RouteHandler=新的MyMvcRouteHandler();
}

该问题是一个逻辑问题和两个相反的业务需求,即:只读和在给定某些条件下修改的需要。 所以,我要做的是回到你的逻辑,涵盖这些条件。 我将使用Set方法SetSessionStateBehavior()对切换进行排序。 例如,添加一个简单的if语句,如下所示(sudo代码)


//在此处执行您需要执行的操作,然后将其设置回原位

您可以尝试Microsoft.AspNet.SessionState.SqlSessionStateProviderAsync 1.1.0版本,该版本支持具有相同sessionid的并发请求。下面是使用该nupkg的步骤。(您可以在上找到有关该软件包的更多详细信息)

  • 安装SqlSessionStateProviderAsync 1.1.0
  • 将appsetting添加到web.config

  • 会话的修改是否基于条件?@CodeNotFound Yes您可以创建另一个具有所需会话的控制器。当条件为时,TestController中的会话为true,然后重定向到新创建的控制器的操作。由于业务需求,这不是一个完全可行的解决方案。我们从前端调用了大约100个控制器,需要重写前端代码。我正在寻找一种完全可以在后端处理的解决方案。您是否尝试过会话或状态存储提供程序?这不是一个可能的解决方案吗?此解决方案只支持对会话状态的异步访问。这并不能从根本上解决我们的问题,因为阻止并发访问SessionState的问题仍然存在,因为SessionState上设置了排他锁。也许你可以通过在相对较短的过期时间内减少过多的锁…但这并不能从根本上解决我的需要,我们已经在尽可能多地缓存我们的结果。在这种情况下,你应该考虑升级到ASP.NET核心(“ASP.NET核心中的会话是非锁定的”),或者是下一个版本的<代码> SqsScript。net 4.6.2调试信息:
        If a condition is met that requires non readOnly then
         SetSessionStateBehavior(
        SessionStateBehavior required
     )