2010-08-10 98 views
2

我試圖建立(CSHARP)一個web服務/ WCF引擎,使兩個動作:web服務/ WCF(定時更新引擎)

  1. 有一個定時器(線程),將在每個10跑10分鐘,請求一些信息(與其他服務器連接以獲取一些信息狀態)在一個數據庫中更新。 (這必須是自動的,不會有任何人爲操作)。這個想法是web服務automaticaly(10x10分鐘)用最新的信息狀態更新數據庫。

  2. 一個服務方法得到一個數據庫的一些信息。 (這是一個簡單的方法,在有人請求時提供信息)。該方法將負責從數據庫中選擇狀態信息。

問題是第1步,因爲第2步非常容易。

誰能幫我,有想法或一些代碼,如何將步驟1 任何模式應該用在這裏?

回答

2

因爲它是一個Web應用程序(例如,在VS2010了「WCF服務應用程序」項目類型),你可以連接到應用程序的事件。

默認情況下,該項目的模板類型不會創建一個Global.asax,所以你需要在「添加新項」,然後選擇「全局應用程序類」(這將不可用,如果你已經有了一個全球.asax,FWIW)。

然後,你可以使用開始和結束事件的應用程序啓動和停止計時器,所以是這樣的:

public class Global : System.Web.HttpApplication 
{ 
    private static readonly TimeSpan UpdateEngineTimerFrequency = TimeSpan.FromMinutes(10); 
    private Timer UpdateEngineTimer { get; set; } 

    private void MyTimerAction(object state) 
    { 
     // do engine work here - call other servers, bake cookies, etc. 
    } 

    protected void Application_Start(object sender, EventArgs e) 
    { 
     this.UpdateEngineTimer = new Timer(MyTimerAction, 
              null, /* or whatever state object you need to pass */ 
              UpdateEngineTimerFrequency, 
              UpdateEngineTimerFrequency); 
    } 


    protected void Application_End(object sender, EventArgs e) 
    { 
     this.UpdateEngineTimer.Dispose(); 
    } 
} 
+0

首先感謝您的答案! 是IIS中的一個webapp(webservice)。 這個動作(點1)在這個項目中非常重要。我必須避免並嘗試獲得最佳解決方案,以避免糟糕的表現或停止服務。相同的web服務向所有300臺服務器請求一些信息(x在x分鐘內 - 使用套接字請求信息)並且用作服務以向客戶端應用提供更新信息。 我需要使用System.Threading.Timer,但我必須找到最好的解決方案。 你知道我是否應該在這裏使用任何模式?從任何書籍的任何好信息你的文章? 再次感謝 – rbfigueira 2010-08-10 10:39:41

+0

我需要在web服務使用System.Threading.Timer但我必須找到使得它的最佳解決方案。狀態信息來自300多個不同和不同的服務器。我必須每10-10分鐘一次(使用套接字請求信息)。 謝謝 – rbfigueira 2010-08-10 10:45:17

+0

重寫了特定於WCF webapp/webservice場景的答案,並給出了一些示例代碼 – 2010-08-11 04:24:17

0

單一職責原則表明,你應該拆分這兩個職責爲兩項服務。一個(Windows服務)將處理定時器。第二個WCF服務將有單個操作來查詢數據庫並返回數據。

這些是獨立的功能,應該獨立執行。

此外,我會建議不要依賴於IIS或Application_Start和類似的方法。這將阻止您的WCF服務託管在WAS或其他環境中。請記住,WCF比ASMX網絡服務更加靈活。它不會限制您的服務託管位置。在對自己的服務進行限制之前,您應該仔細考慮。

+0

John,您是對的,但在這種情況下,我們需要在同一個Web服務中承擔這兩項責任。也許你可以在這種特殊情況下指出我們需要使用的更多原則或模式。謝謝 – rbfigueira 2010-08-11 09:41:00

+0

你能指點我其他的解決方案(模式,想法等)嗎?記住我需要在同一個Web服務中承擔這兩項責任? – rbfigueira 2010-08-11 09:51:03

+0

@rbfigueira:你還沒有說過他們爲什麼需要在同一個服務中。 – 2010-08-11 19:03:25