2014-05-18 70 views
3

我有一個頁面的應用程序與Angular.js front,web api2後端,也使用Castle Windsor和SignalR。HttpApplication不退出

我在維護服務器狀態的服務器上使用c#組件。因此,在Application_Start()上,我將Castle Windsor的主要組件註冊爲Singleton。

IoC.Container.Register(Component.For(typeof(MainManager)).ImplementedBy(typeof(MainManager)).LifeStyle.Singleton); 

(但是,我測試PerWebRequest和一些其他的生活方式,但主要問題仍然是相同的,所啓動的任務不退出)

然後在我的網絡API,我可以對該實例執行命令。

[HttpGet] 
public void StartProcess(Params p) { 
    IoC.Resolve<MainManager>().StartOperation(p); 
} 

而這也給了我機會,從網站停止它通過調用另一個控制器方法

[HttpGet] 
public void Stop() { 
    IoC.Resolve<MainManager>().RequestStop(); 
} 

這大部分的偉大工程。但是,有時我的應用程序處於不良狀態(由於多種原因,它可以在產品中重新啓動)我可以通過在運行操作期間修改web.config來模擬此問題,因此很多事情都會重置(例如Signal- R連接),但主要操作不會停止運行。 (事實上​​,一旦我的應用程序處於不良狀態,我不能再調用Stop控制器方法,因爲MainManager已被重置,所以現在停止它的唯一方法是重置整個IIS。不想)

我想弄清楚如何檢測這種狀態,並終止正在運行的過程。

作爲一個可能的解決方案,我用綁定生活方式(在溫莎城堡3個新的),我的經理試圖範圍到我的網頁API HttpApplication的試驗,但還沒有運氣。

更新

我試圖使主要任務方法靜態

[HttpGet] 
public void Start(ForceData data) { 
    MainManager.Start(data); 
} 

我相信這應該拿出一個實例,該出方程,但代碼仍然運行觸摸網在未中斷的.config

更新

將MainManager類帶出等式。我的所有web api方法現在都是循環+睡眠

[HttpGet] 
public void Start(ForceData data) { 
    foreach (var e in data.Members) 
    { 
    _log.Info("processing member: {0}", e.Email); 
    Thread.Sleep(1000); 
    } 
} 

此循環在觸摸web.config後也不會中斷。

所以,在這一點上,我閱讀有關MVC request lifecycle找出此時這個請求轉到殭屍胭脂

+1

更改線程以使它們將'IsBackground'設置爲true。 'MainManager.Stop()'將在正常退出時正常停止它們,'thread.IsBackground'將確保應用程序在失敗時可以關閉。 – jgauffin

+0

@jgauffin我沒有明確地產生任何線程。你是說我應該開始這樣做,以設置該屬性? –

+0

後臺線程會工作,但如果我必須產生一個新的線程,這將改變諸如身份/安全等。我的應用程序目前依賴於httpcontext等..是否有可能創建一個與當前線程相同的一切後臺線程? –

回答

0

這是設計,一個HttpApplication實例不會立即釋放,當應用程序重新啓動,

http://msdn.microsoft.com/en-us/library/vstudio/ms178473%28v=vs.100%29.aspx

當需要重新啓動應用程序,ASP.NET將服務從現有的應用程序域中的所有未決請求和舊組件重新啓動應用程序域和加載新的前組件。

在所有示例Web API方法中,可以看到線程仍處於忙碌狀態,這意味着ASP.NET運行時認爲此請求仍在處理中。

+0

你知道嗎? Application_End不會被觸發 –

+0

正如同一篇文章中隱含說明的那樣,只有在服務所有掛起的請求時才調用「Application_End」。因此,您的應用程序很難檢測到重新啓動。一般來說,您應該放棄當前的同步方法,並測試異步支持是否有助於在這種情況下,http://www.asp.net/mvc/tutorials/mvc-4/using-asynchronous-methods-in-aspnet -mvc-4和http://blog.mariusschulz.com/2014/05/07/scheduling-background-jobs-from-an-asp-net-application-in-net-4-5-2。他們應該允許你更好地控制你的任務。 –

+0

會嘗試並報告我的發現,謝謝 –