2009-11-16 84 views
0

這是關於XHR和WebMethod(asmx)的糾結羣集。該模式很簡單,我通過XHR調用Webmethod,但似乎WebMethod是同步而不是異步的。我只需要使這個轉換異步。我正在搜索和搜索(可能不擅長搜索),但無法找到任何可以解決此謎題的任何內容。如何在C#中進行異步Web服務調用?

在這裏,我如何讓通過XHR電話:

$.ajax = { 
    pool: [], 
    call: function(settings, onSuccess, onFailure) { 
     var xhr = new XMLHttpRequest(); 
     xhr.open(settings.type, settings.location, settings.async); 
     xhr.onreadystatechange = function() { 
      if (xhr.readyState == 4) { 
       if (xhr.status == 200) { 
        var result = xhr.responseXML.xml.toString(); 
        onSuccess($.Encoder.htmlDecode(result)); 
      } 
     }; 
     $.ajax.pool.push(xhr); 
     xhr.send(null); 
     return xhr; 
    } 
} 

然後:

$.ajax.call({ type: "get", location: "Index.asmx/RaiseCallbackEvent?eventArgument=ramiz.uddin" , async: true }, function(e) {}, function(e){}) 

的Web服務是相當簡單太:

[WebMethod(EnableSession = true)] 
    [ScriptMethod(UseHttpGet = true)] 
    public string RaiseCallbackEvent(string eventArgument) 
    { 
     // some logic 
     return "<say>hello</say>"; 
    } 

有些web.config文件條目允許POST,GET調用:

<webServices> 
     <protocols> 
     <add name="HttpSoap"/> 
     <add name="HttpPost"/> 
     <add name="HttpGet"/> 
     </protocols> 
    </webServices> 

你能指導我爲異步做什麼嗎?

謝謝。

+1

爲什麼不直接使用默認的jQuery AJAX在默認情況下http://docs.jquery.com/Ajax/jQuery.ajax是異步 - 它是什麼你試圖用你的方法添加? – 2009-11-16 08:32:47

+0

這必須用.net來做一些事情來使web服務異步。不是Javascript。 JQuery很好,但我們有自己的一套客戶端庫,這是爲了一個目的,它是好的。 – 2009-11-16 09:22:24

回答

0

我敢打賭,你會在Google上找到大量的例子,但是對於後臺,如果你看到有函數被列爲Begin [YourWebMethodName]和End [YourWebMethodName]。 Begin ...在異步調用時被調用,其中我們必須傳遞一個異步調用完成後調用的方法,並且除了需要調用其他處理外,此方法還需要調用End [YourWebMethodName]

某些代碼... ...

AsyncCallback ACB = new AsyncCallback(MyCallbackMethod); 

    // Issue an asynchronous call<br> 

    mywebsvc.BeginMyWebMethod1(name, ACB, mywebsvc); 

    // Forget and Continue further 



//This is the function known as callback function <br> 
public void MyCallbackMethod(IAsyncResult asyncResult) 
{ 
     MyWebService mywebsvc = 
    (MyWebService)asyncResult.AsyncState; 

     result = webServ.EndMyWebMethod1(asyncResult); 

     //use the result 


}