這樣做的正確方法是使用基於隊列的通信。原因是可擴展性。你想讓你的服務的「實例」接收請求,並且你希望「一個實例」將結果返回給客戶端嗎?
您可以快速瀏覽一下我的關於AppFabric Queues的博客文章,但它們太笨重了。下面是如何I'do它:
創建WorkerRequest類,看起來像這樣
public class WorkerRequest {
string clientId;
MyTaskEnum taskToPerform;
}
寫入隊列存儲,(在我的生產代碼,我使用的是我還沒有博客的包裝關於然而,但計劃:)),添加請求。
有一個工作線程監聽這個隊列,並且當收到一個請求時,產生一個新的線程來完成它。完成後,使用您的任務&客戶端ID作爲您的密鑰,寫入表存儲。這樣,你可以隨時檢查狀態(簡單/ GET /請求表)+你已經解除了&可擴展性已經解決。
希望它有幫助。
UPDATE:想解釋一點,所以我決定更新帖子=)
您可以在「Web角色」,這是我會做什麼創建一個WCF Web服務。我前一段時間是blogged about。在同一個角色中,您創建一個工作人員。你通過實施RoleEntryPoint
的課程來達到這個目的。這個類(位於Microsoft.WindowsAzure.ServiceRuntime)的樣子:
public abstract class RoleEntryPoint
{
public virtual bool OnStart()
{
return true;
}
public virtual void Run()
{
Thread.Sleep(-1);
}
public virtual void OnStop()
{
}
}
您簡單地實現在運行一段時間(true)循環,詢問隊列是否有用於處理任何新的消息。當收到這樣的消息不會產生一個新的,只是處理它。如果您想縮放它,可以通過添加新實例進行縮放。顯然,這可能是昂貴的,所以實際上產生新線程是明智的,但僅限於某個極限,例如,最多5個線程。如果池中沒有線程,則將消息返回隊列(當您完成消息時,您需要調用Complete()
,否則它不一定會被刪除)。它會在稍後或另一名工作人員中被拾起。
因此,當工作線程完成時,將結果寫入表存儲並完成。
+1兩個答案 - 同一個想法在同一時間。在極端情況下 - 客戶端和服務器之間需要真正緊密的耦合 - 那麼您也可以使用粘滯會話模式 - http://dunnry.com/blog/2010/10/14/StickyHTTPSessionRoutingInWindowsAzure.aspx - 但這不適用於簡單情況下(IMO) – Stuart
我必須誠實地說,馬丁巴比我快了4秒。 –
表存儲/ appfabric緩存的使用是誘人的,並會簡化大部分的輪詢。但大衛斯蒂爾建議的工作者角色聽起來也很有趣... –