2022年4月12日 星期二

[研究][ASP.NET]使用 SQL Server 儲存 Session State 會談狀態(二)System.Web.Providers

[研究][ASP.NET]使用 SQL Server 儲存 Session State 會談狀態(二)System.Web.Providers

2022-04-12

環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C#

續這篇

[研究][ASP.NET]使用 SQL Server 儲存 Session State 會談狀態(一)aspnet_regsql.exe
https://shaurong.blogspot.com/2022/04/aspnet-sql-server-session-state.html

用aspnet_regsql.exe需要自己手動在SQL Server建立資料表,用 NuGet 安裝 System.Web.Providers可讓系統自動在資料庫建立 dbo.sessions資料表。

先用 NuGet 安裝 System.Web.Providers 1.2.0,其實描述有說 Legacy package, System.Web.Providers is now included in the 'Microsoft.AspNet.Providers' package.,這次先不管,先安裝。它會要求安裝相依套件:

Microsoft.AspNet.Providers.Core.1.0.0

Microsoft.AspNet.Providers.1.1.0

System.Web.Providers.1.2.0

NuGet會在Web.Config建立一個資料庫連線 DefaultConnection,還有一堆設定使用該連線。

之後隨便建立一個 Default.aspx (隨便取個名稱),拖拉一個SqlDataSource控制項過去,設定資料庫連線,假設稱為 TestDB6ConnectionString。

最後把 Web.Config 中 "DefaultConnection" 字串全換成 "TestDB6ConnectionString",把原來的 資料庫連線 DefaultConnection 註解掉。再把 sessionState mode="InProc" 換成 sessionState mode="Custom",結果如下:

Web.Config

<?xml version="1.0" encoding="utf-8"?>
<!--
  如需如何設定 ASP.NET 應用程式的詳細資訊,請前往
  https://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.8" />
    <httpRuntime targetFramework="4.8" />
    <profile defaultProvider="DefaultProfileProvider">
      <providers>
        <add name="DefaultProfileProvider" type="System.Web.Providers.DefaultProfileProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="TestDB6ConnectionString" applicationName="/" />
      </providers>
    </profile>
    <membership defaultProvider="DefaultMembershipProvider">
      <providers>
        <add name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="TestDB6ConnectionString" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" />
      </providers>
    </membership>
    <roleManager defaultProvider="DefaultRoleProvider">
      <providers>
        <add name="DefaultRoleProvider" type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="TestDB6ConnectionString" applicationName="/" />
      </providers>
    </roleManager>
    <!--
            If you are deploying to a cloud environment that has multiple web server instances,
            you should change session state mode from "InProc" to "Custom". In addition,
            change the connection string named "TestDB6ConnectionString" to connect to an instance
            of SQL Server (including SQL Azure and SQL  Compact) instead of to SQL Server Express.
      -->
    <sessionState mode="Custom" customProvider="DefaultSessionProvider">
      <providers>
        <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="TestDB6ConnectionString" />
      </providers>
    </sessionState>
  </system.web>
  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701" />
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
    </compilers>
  </system.codedom>
  <connectionStrings>
    <!--<add name="TestDB6ConnectionString" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=aspnet-WebApplication1-20220412140321;Integrated Security=SSPI"
      providerName="System.Data.SqlClient" />-->
    <add name="TestDB6ConnectionString" connectionString="Data Source=.;Initial Catalog=TestDB6;Persist Security Info=True;User ID=sa;Password=P@ssw0rd"
      providerName="System.Data.SqlClient" />
  </connectionStrings>
</configuration>

在 Visual Studio 2022 中 Default.aspx 按下 F5 執行,TestDB6資料庫中會自動建立 dbo.sessions 資料表。


另外下面這兩個已經出到 2.0.0版,但 System.Web.Providers 1.2.0 只會安裝 1.x版,所以需要自己手動再執行一次,把他們升級到 2.0.0 版。

Microsoft.AspNet.Providers.Core.1.0.0

Microsoft.AspNet.Providers.1.1.0

(完)

相關

[研究][ASP.NET]使用 SQL Server 儲存 Session State 會談狀態(一)aspnet_regsql.exe
https://shaurong.blogspot.com/2022/04/aspnet-sql-server-session-state.html

[研究][ASP.NET]使用 SQL Server 儲存 Session State 會談狀態(二)System.Web.Providers
https://shaurong.blogspot.com/2022/04/aspnet-sql-server-session-state_12.html


沒有留言:

張貼留言