Привет!
У меня есть 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? Этикетки? И как это может быть возвращено статическим вспомогательным классом в веб-форму?





Литерал в условной панели обновления подойдет.
<asp:UpdatePanel ID = "up" runat = "server" UpdateMode = "Conditional">
<ContentTemplate>
<asp:Literal ID = "litUpdateMe" runat = "server" />
</ContentTemplate>
</asp:UpdatePanel>
Вероятно, веб-форма, если пользователь не взаимодействует с ней или нет обратной связи с пользователем, необходима.
Я имею в виду метод, а не веб-форму
Асинхронные страницы полезны в сценариях, когда вам нужно асинхронно вызывать методы веб-службы.
Имеет ли смысл вызывать MyWebSvc.DoWork () асинхронно из WebSvcsMgr.DoAllWork () или, скорее, вызывать WebSvcsMgr.DoAllWork () асинхронно из веб-формы?