Обновление пользовательского интерфейса после асинхронных вызовов WebMethod - PullRequest
6 голосов
/ 30 сентября 2008

Привет!

У меня есть WebService, который содержит WebMethod, который выполняет некоторую работу и возвращает логическое значение. Работа, которую она выполняет, может занять или не занять некоторое время, поэтому я бы хотел назвать ее асинхронно.

[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;        
    }
}

Этот веб-сервис существует на каждом сервере в веб-ферме. Поэтому для вызова метода DoWork () на каждом сервере у меня есть библиотека классов для этого, основанная на списке URL-адресов серверов:

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();
        }
    }
}

Наконец, это вызывается из веб-интерфейса в событии asp: Button click следующим образом:

WebSvcsMgr.DoAllWork(server_list);

Для статического метода DoAllWork (), вызываемого веб-формой, я планирую сделать это асинхронным вызовом через IAsyncResult. Тем не менее, я хотел бы сообщить об успехе / неудаче DoWork () WebMethod для каждого сервера в ферме, когда возвращаются результаты. Каков наилучший подход к этому в сочетании с UpdatePanel? GridView? Этикетки? И как это может быть возвращено статическим вспомогательным классом в веб-форму?

Ответы [ 2 ]

1 голос
/ 02 октября 2008

Асинхронные страницы полезны в сценариях, когда необходимо асинхронно вызывать методы веб-службы.

0 голосов
/ 30 сентября 2008

Литерал в панели условного обновления будет в порядке.

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