---
# System prepended metadata

title: IIS
tags: [Learning]

---

# IIS
###### tags: `Learning`

### 讓 Session 不會自動消失

#### ★Session消失的原因
* Timeout: web.config裡的SessionState Timeout屬性，單位是分鐘。
* Code裡面執行了清除Session的動作，如Session.Abandon()、Session.Clear()、Session.RemoveAll()
* window.open 與 window.showModalDialog 混合使用 (?)
* 當URL中的機器名稱中使用底線時(例如: http://web_server/myApp)，會導致Cookie無法使用，進而造成Session失效。
* 防毒軟體
* 重新啟動 IIS
* 修改 Web.config、Bin回收
* 若有多台 Server 因每台 Server 的 Session 不同 ( Ex. 今天在 Server A 存了 Session Egg，若下次的 Request 是 Call Server B，User 就會找不到 Session Egg )

#### ★多台 Server 解決方案
[ASP.NET程式中Session儲存的幾種模式](https://www.itread01.com/content/1546942022.html)

<table>
  <tbody>
   <tr class="alt">
    <th>值</th> 
    <th>說明</th> 
   </tr>
   <tr>
    <td> <p><strong>Custom</strong></p> </td> 
    <td> <p>會話狀態將使用自定義資料儲存區來儲存會話狀態資訊。</p> </td> 
   </tr>
   <tr class="alt">
    <td> <p><strong>InProc</strong></p> </td> 
    <td> <p>會話處於正在處理 ASP.NET 輔助程序的狀態。</p> </td> 
   </tr>
   <tr>
    <td> <p><strong>Off</strong></p> </td> 
    <td> <p>會話狀態被禁用。</p> </td> 
   </tr>
   <tr class="alt">
    <td> <p><strong>SQLServer</strong></p> </td> 
    <td> <p>會話狀態將使用程序外 SQL Server 資料庫來儲存狀態資訊。</p> </td> 
   </tr>
   <tr>
    <td> <p><strong>StateServer</strong></p> </td> 
    <td> <p>會話狀態將使用程序外 ASP.NET 狀態服務來儲存狀態資訊。</p> </td> 
   </tr>
  </tbody>
</table>

#### ★特別說明使用 State Service
##### 啟用
1. 請到 控制台 > 系統管理工具 > "服務"
2. 找到 "ASP.NET 狀態服務" 或 "ASP.NET State Service"
3. 此服務預設是屬於「停用」的狀態，請先切換到「自動」再按下「套用」再直接按「啟動」按鈕即可。

[參考資料 - 如何讓 ASP.NET 使用 Session 資料時不要再自動消失](https://blog.miniasp.com/post/2008/01/12/How-to-avoid-Session-data-loss-in-ASPNET)

※ ASP.NET State Service 是存在 Server 本機中，非 IIS

##### ★遠端共用 ASP.NET State Service
首先，必須使用 regedit 工具修改系統機碼
![](https://i.imgur.com/v9rXY2Q.png)

執行 regedit

先找到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters\Port

再將 AllowRemoteConnection 改成 1

如果你想改預設的 42424 Port 的話，也可以在這時修改成你想用的 Port number 並設定好防火牆規則。

![](https://i.imgur.com/hWcKMJp.png)

接著，將 ASP.NET 狀態服務 重新啟動。
再來，修改每一台 Web 伺服器的 web.config 即可。

```
<configuration>
  <system.web>
    <sessionState mode="StateServer"
      stateConnectionString="tcpip=You.State.Server.IP:42424"
      cookieless="false"
      timeout="20"/>
  </system.web>
</configuration>
```

[參考資料 - 如何讓【ASP.NET 狀態服務】開放遠端連接](https://blog.miniasp.com/post/2008/01/12/How-to-let-ASPNET-State-Service-allow-remote-connection)