受How to: Implement an Asynchronous Service Operation和Building 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」一起彈出。
任何人都可以發現我做錯了什麼或者可能提出另一種方法嗎?
事實上我。我會在今晚嘗試在IIS上運行它,然後我會告訴你它是如何發生的。謝謝。 – Vache
運氣好嗎?取得明確的東西會很棒。 –
請原諒我這麼久。我遇到了需要重新安裝Windows的問題,並且需要一段時間才能完成。所以看起來好像Dev Server是問題的一部分,但我現在有一個不同的問題。點擊我的按鈕(或帶有onClick事件的文本鏈接)仍然不起作用,但如果我在地址欄中鍵入'javascript:Click()',我確實會出現異步行爲。你有任何線索爲什麼會發生這種情況? – Vache