2012-05-10 62 views
1

How to: Implement an Asynchronous Service OperationBuilding Task Based WCF Services with Task Parallel Library的啓發,我試圖用一個異步執行的操作來創建WCF Web服務。異步WCF服務的執行被阻止

這個想法是,我有一個方法可以持續工作,可以持續從網頁上的按鈕調用的秒鐘到分鐘的任何地方,並且我有一個計時器可以在同一個服務中調用另一個方法,返回異步操作的狀態(工作與否)。

因此,我設置了一個虛擬示例,我的異步操作實際上阻止了我的Web服務。

[ServiceContract(Namespace = "")] 
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)] 
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)] 
public class Service1 
{ 
    [OperationContract(AsyncPattern = true, Action = "TestServiceMethod", Name = "TestServiceMethod", ReplyAction = "TestServiceMethodReply")] 
    public IAsyncResult BeginTestServiceMethod(string request, AsyncCallback callback, object asyncState) 
    { 
     var task = new Task<string>((state) => 
     { 
      SpinWait.SpinUntil(() => { return false; }, 5000); 
      return request; 
     }, asyncState); 

     task.ContinueWith((t) => { callback(t); }); 
     task.Start(); 

     return task; 
    } 

    public string EndTestServiceMethod(IAsyncResult result) 
    { 
     var task = (Task<string>)result; 
     return task.Result; 
    } 

    [OperationContract] 
    public string OtherTest() 
    { 
     return "OtherTest"; 
    } 
} 

,這是我的網頁上的JavaScript

function Click() { 
    var service = new Service1(); 
    service.TestServiceMethod("Dummy", PopWord); 
    service.OtherTest(PopWord); 
} 

function PopWord(word) { 
    alert(word); 
} 

結果是5秒等待,當我按一下按鈕,其次是「(點擊功能是通過點擊一個按鈕激活)虛擬「和」其他測試「一個接一個地彈出。預期的行爲將是「OtherTest」在5秒鐘後與「Dummy」一起彈出。

任何人都可以發現我做錯了什麼或者可能提出另一種方法嗎?

回答

2

我猜你正在cassini(開發服務器)上運行,而不是在IIS上?

如果是這樣,我見過不少人說卡西尼不能並行執行請求。

我似乎無法從微軟找到任何關於此的文檔,但在堆棧溢出中有相當多的帖子與以下類似。

ASP.NET Development Server concurrent processing doesn't work

ASP.NET Dev Server (Cassini), IIS Express and multiple threads

+0

事實上我。我會在今晚嘗試在IIS上運行它,然後我會告訴你它是如何發生的。謝謝。 – Vache

+0

運氣好嗎?取得明確的東西會很棒。 –

+0

請原諒我這麼久。我遇到了需要重新安裝Windows的問題,並且需要一段時間才能完成。所以看起來好像Dev Server是問題的一部分,但我現在有一個不同的問題。點擊我的按鈕(或帶有onClick事件的文本鏈接)仍然不起作用,但如果我在地址欄中鍵入'javascript:Click()',我確實會出現異步行爲。你有任何線索爲什麼會發生這種情況? – Vache