2008-09-30 7 views
6

Grüße!Aktualisieren der Benutzeroberfläche nach asynchronen WebMethod-Calls

Ich habe einen WebService, der eine WebMethod enthält, die etwas Arbeit leistet und einen booleschen Wert zurückgibt. Die Arbeit, die es macht, kann einige Zeit dauern, deshalb möchte ich es asynchron nennen.

[WebService(Namespace = "http://tempuri.com/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[System.ComponentModel.ToolboxItem(false)] 
public class MyWebSvc : System.Web.Services.WebService 
{ 
    [WebMethod] 
    public bool DoWork() 
    { 
     bool succ = false; 

     try 
     { 
      // do some work, which might take a while 
     } 
     catch (Exception ex) 
     { 
      // handle 
      succ = false; 
     } 

     return succ;   
    } 
} 

Dieser WebService existiert auf jedem Server in einer Webfarm. So auf jedem Server die DoWork() -Methode aufrufen, habe ich eine Klassenbibliothek, so zu tun, basierend auf einer Liste von Server-URLs:

static public class WebSvcsMgr 
{ 
    static public void DoAllWork(ICollection<string> servers) 
    { 
     MyWebSvc myWebSvc = new MyWebSvc(); 

     foreach (string svr_url in servers) 
     { 
      myWebSvc.Url = svr_url; 
      myWebSvc.DoWork(); 
     } 
    } 
} 

Schließlich ist diese von der Web-Schnittstelle in einem asp genannt wird: Button klicken Ereignis wie folgt:

WebSvcsMgr.DoAllWork(server_list); 

Für die statische DoAllWork() -Methode durch das Web-Formular genannt, ich plane dies ein asynchroner Aufruf über IAsyncResult zu machen. Ich möchte jedoch einen erfolgreichen/fehlgeschlagenen DoWork() - WebMethod für jeden Server in der Farm melden, wenn die Ergebnisse zurückgegeben werden. Was wäre der beste Ansatz dazu in Verbindung mit einem UpdatePanel? Ein GridView? Etiketten? Und wie könnte dies von der statischen Helper-Klasse zum Web Form zurückgegeben werden?

Antwort

0

Ein Literal in einem bedingten Update Panel wäre in Ordnung.

<asp:UpdatePanel ID="up" runat="server" UpdateMode="Conditional"> 
    <ContentTemplate> 
    <asp:Literal ID="litUpdateMe" runat="server" /> 
    </ContentTemplate> 
</asp:UpdatePanel> 
+0

Wäre es sinnvoller, MyWebSvc.DoWork() asynchron von WebSvcsMgr.DoAllWork() aufzurufen, oder WebSvcsMgr.DoAllWork() asynchron vom Webformular aus aufzurufen? – Bullines

+0

Wahrscheinlich das Webformular, wenn der Benutzer nicht mit ihm interagiert oder nicht Benutzerfeedback erforderlich ist. – craigmoliver

+0

Ich meine die Methode, nicht die Webform – craigmoliver

1

Asynchronous pages sind in Szenarien nützlich, wenn Sie asynchron benötigen, um Web-Service-Methoden aufrufen.