如果你曾經修改了ASP.NET應用程式(dll檔案),與修改了bin檔案夾或Web.config檔案(添加/刪除/重新命名的檔案等),而該網站在運行,你可能已經注意到,這將導致在AppDomain的重新啟動。所有的工作階段狀態會丟失和網站再次成功啟動,任何登入的使用者將被退出(假設你不使用持久Cookie身分識別驗證)。 當然,當我們修改了web.config檔案,並儲存它,迫使一個AppDomain重新啟動,這是我們需要的。
我們有時動態建立和刪除的檔案夾,在ASP.NET 2.0中,檔案夾刪除將導致一個AppDomain重新啟動,這將導致嚴重的問題。 例如,對於一個電子商務網站的產品,你可能想儲存在目錄中的產品來自它的名字ID的產品的圖片,例如。/ productImages/123/ipod-nano.jpg,甚至為身份證映像的記錄。 這有助於避免與其他上傳的檔案和影像檔名衝突。 當然,當你來到刪除從資料庫產品,你自然要刪除其相應的映像和含有它的檔案夾,但顯然不能因為這AppDomain重新啟動的問題。 因為,我們刪除留在我們的伺服器中的空檔案夾(檔案刪除不會引起應用程式重新啟動)。
解決方案
幸運的是,我們有了Reflection and HttpModules的解決方案。 首先建立一個像.cs檔案... 複製代碼 代碼如下:using System.Reflection;
using System.Web;
namespace MyWebsite
{
/// <summary>
/// Stops the ASP.NET AppDomain being restarted (which clears
/// Session state, Cache etc.) whenever a folder is deleted.
/// </summary>
public class StopAppDomainRestartOnFolderDeleteModule : IHttpModule
{
public void Init(HttpApplication context)
{
PropertyInfo p = typeof(HttpRuntime).GetProperty("FileChangesMonitor",
BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static);
object o = p.GetValue(null, null);
FieldInfo f = o.GetType().GetField("_dirMonSubdirs",
BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase);
object monitor = f.GetValue(o);
MethodInfo m = monitor.GetType().GetMethod("StopMonitoring",
BindingFlags.Instance | BindingFlags.NonPublic);
m.Invoke(monitor, new object[] { });
}
public void Dispose() { }
}
}
如果您喜歡在 Application_Start使用Global.asax檔案中,放置在Init()代碼在Application_Start 中。 我相信在Global.asax使用方法已淘汰,在使用HttpModules可以響應網路(應用程式生命週期的會話開始,會話結束時,)。 init方法在Global.asax同Application_Start作用是一樣的,Dipose類似於Application_End。
我們要以上述代碼起作用,需要在web.config檔案<httpModules>區段中放入:
<add name="stopAppDomainRestartOnFolderDelete"
type="MyWebsite.StopAppDomainRestartOnFolderDeleteModule" />
需要說明的是,"stopAppDomainRestartOnFolderDelete"為自訂的任意名稱,"MyWebsite"為上述.cs檔案中的命名空間,一般為項目名稱."StopAppDomainRestartOnFolderDeleteModule"為上述.cs檔案中的類名.
這就是它。 這將防止檔案夾刪除AppDomain重新啟動,但修改web.config和bin檔案夾時仍會重新啟動,這正是我們想要的。
但是多刪除幾個檔案就會發現session還是會到期,為什麼會是這樣的呢?現在還沒搞清楚...於是在網上搜尋就有了下面的這種方式
在 <system.web>下面配置session的儲存方式為stateserver就可以了
<sessionState mode="StateServer" stateNetworkTimeout="20"
stateConnectionString="tcpip=127.0.0.1:42424" />
參數一看就知道是什麼意思了..