asp.net 允许会话状态提供程序继承自SessionStateStoreProviderBase的每个会话的并发请求

ff29svar  于 2023-01-27  发布在  .NET
关注(0)|答案(1)|浏览(172)

我正在使用第三方CMS,该CMS使用从System.Web.SessionState.SessionStateStoreProviderBase继承的自定义SessionStateProvider。System.Web.SessionState.SessionStateModule用作SessionStateModule。
我需要允许每个会话的并发请求与可写会话。这可以使用aspnet:AllowConcurrentRequestsPerSession设置时,从here使用AsyncSessionStateModule完成。这将满足我的要求,但这需要提供程序继承Microsoft.AspNet.SessionState.SessionStateStoreProviderAsyncBase和提供程序从第三方CMS不。
我知道这可以通过实现ISessionStateModule来实现,但这似乎风险很高,很容易出错。是否已经有一个SessionStateModule满足我的要求(似乎我不是第一个遇到这个问题的人)?

  • 允许每个会话并发请求
  • 可写会话(即没有SessionStateBehavior.ReadOnly来实现并发请求)
  • 支持从System.Web.SessionState.SessionStateStoreProviderBase继承的提供程序

或者我在这里错过了什么,这可以用一种更容易的方式实现吗?

tvz2xvvm

tvz2xvvm1#

我在几个不同的场景中使用过Microsoft.AspNet.SessionState.SessionStateModule

  1. Microsoft.AspNet.SessionState.InProcSessionStateStoreAsync-此提供程序包含在NuGet包中,使用起来简单得多,因为它不需要外部依赖关系。但是,您需要确保用户访问同一个Web服务器。如果您有多个服务器部署,则需要负载平衡器上的“粘性会话”。
  2. Microsoft.Web.Redis.RedisSessionStateProvider-这个提供者需要2个额外的NuGet包和一个Redis示例。我只推荐在多服务器配置中使用这个配置,在那里你的负载平衡器上没有“粘性会话”。
    示例web.config设置:
<?xml version="1.0" encoding="utf-8"?>
<configuration>

  <appSettings>
    <add key="aspnet:AllowConcurrentRequestsPerSession" value="true" />
  </appSettings>

  <system.webServer>
    <modules>
      <remove name="Session" />
      <add name="Session" type="Microsoft.AspNet.SessionState.SessionStateModuleAsync" preCondition="integratedMode" />
    </modules>
  </system.webServer>

  <!-- Option 1: InProcSessionStateStoreAsync -->
  <sessionState mode="Custom" customProvider="InProcSessionStateStoreAsync" cookieless="UseCookies">
    <providers>
      <add name="InProcSessionStateStoreAsync" type="Microsoft.AspNet.SessionState.InProcSessionStateStoreAsync" />
    </providers>
  </sessionState>

  <!-- Option 2: RedisSessionStateProvider -->
  <sessionState mode="Custom" customProvider="RedisSessionStateProvider" cookieless="UseCookies">
    <providers>
      <add name="RedisSessionStateProvider" type="Microsoft.Web.Redis.RedisSessionStateProvider" connectionString="..." />
    </providers>
  </sessionState>

</configuration>

相关问题