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