2009-11-16 4 views
0

Речь идет о запутанном кластере XHR и WebMethod (asmx). Шаблон прост, я делаю вызовы через XHR в Webmethod, но кажется, что WebMethod синхронизирован не async. Мне просто нужно сделать этот переход асинхронным. Я ищу и ищу (может быть, не так хорошо в поиске), но не смог найти ничего, что могло бы решить эту тайну.Как сделать асинхронный вызов webservice в C#?

Вот, как я делает звонки через 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){}) 

вебсервис довольно просто тоже:

записи
[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 - что это вы пытаетесь добавить с вашим методом? –

+0

Это должно что-то сделать с .net, чтобы сделать асинхронный веб-сервис. не Javascript. JQuery хорош, но у нас есть собственный набор клиентской библиотеки, который существует с определенной целью, и это хорошо. –

ответ

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 


}