---
# System prepended metadata

title: ashx 使用 IRequiresSessionState的效能問題

---

# ashx 使用 IRequiresSessionState的效能問題

如果ashx需要Session的資訊，但**不需要**改變Session內容，建議再繼承 **System.Web.SessionState.IReadOnlySessionState**。

因為僅使用IRequiresSessionState，會導致Session被鎖定，ashx跑完後，需要一段時間才會釋放Session。

所以多次呼叫繼承IRequiresSessionState的ashx，每個ashx都需要排序處理，處理完後，下一個request也需要等待Session被釋放，導致次Request的情況效能不佳。

> 以下是僅使用IRequiresSessionState的情況，
> 同時Request，到最後一個Request處理完已經2秒多
> ![](https://i.imgur.com/DflcYDM.png)
> 

> 以下是加上IReadOnlySessionState的情況，
> Request就不會因為Session鎖定而導致無法同時執行。
![](https://i.imgur.com/ogGf3tF.png)


* StatisticsData.ashx
``` java=
<%@ WebHandler Language="C#" Class="StatisticsData" %>

public class StatisticsData : 
        IHttpHandler, 
        // 要求使用Session
        System.Web.SessionState.IRequiresSessionState, 
        // 僅唯讀Session，避免Session Lock
        System.Web.SessionState.IReadOnlySessionState
{
    public void ProcessRequest(HttpContext context)
    {
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}
```