Допустим, вы вызываете два метода в WCF со стороны клиента, причем один веб-метод рекурсивно (или, скорее, итеративно) вызывает другой веб-метод в некотором роде.Простой пример ниже в псевдокоде, который работает, но я не думаю, что у меня есть надлежащая обработка исключений на месте.Каков наилучший шаблон дизайна для клиента и для сервера для обработки ситуаций, когда сервер выходит из строя?
Я прочитал ссылки 1-3 ниже, и они, кажется, подразумевают, что вы должны распоряжаться вещами на любом клиентеили на стороне сервера - это правильно?
Я использую WCF в Silverlight 3.5, использую Visual Studio 2008 с C # в качестве языка кода, но я не думаю, что это так важно, поскольку это универсальный вопрос.
// PSEUDOCODE:
// предположим, что FirstWebService возвращает коллекцию объектов, скажем, MyObjects, в списке // предположим, что SecondWebservice берет эту коллекцию и что-то с ней делает.
ServiceReference1.Service1Client aClient;приватный список myObjectList = new List ();
public Page1 () {InitializeComponent ();
aClient = new myWebService.ServiceReference1.Service1Client ();
aClient.FirstWebService + = новый EventHandler (aClient_FirstWebServiceCompleted);
aClient.SecondWebServiceCompleted + = новый EventHandler (aClient_SecondWebServiceComted);
}
// теперь, когда вы нажимаете кнопку, вы будете вызывать первый веб-сервис, который затем будет вызывать второй веб-сервис (много раз), пока цикл foreach не будет исчерпан.
private void Button1_Click (отправитель объекта, RoutedEventArgs e) {aClient.FirstWebServiceAsync ();// вызывает первый веб-сервис (который, в свою очередь, будет вызывать второй веб-сервис "рекурсивно" (или фактически многократно), см. ниже)
}
void aClient_FirstWebServiceCompleted (отправитель объекта, myWebService.ServiceReference1.FirstWebServiceCompletedEventArgs e) {
if (e.Error == null)
{
myObjectList = e.Result; //assume both server side myObject and client side myObject are the same thing, so no type checking compiler error here with the Lists.
// Вот «рекурсивная» часть (цикл):
foreach (myObject O в myObjectList) {aClient.SecondWebServiceAsync (O);// обратите внимание на рекурсивный, вложенный асинхронный вызов от первого веб-сервиса ко второму веб-сервису здесь ... выполняется много раз, пока цикл foreach не будет исчерпан.}}
else
{
//handle errors here
}
}
void aClient_SecondWebServiceCompleted (отправитель объекта, myWebService.ServiceReference1.SecondWebServiceCompletedEventArgs e) {
if (e.Error == null)
{
// do stuff here = e.Result; //etc
} здесь, ошибкас момента e.Error! = null}}
/ * // Я пробовал описанное выше, и оно работает, но пока не удалось.У вас каждый веб-сервис "делает свое дело" асинхронно.Пока это работает хорошо, но веб-методы не сложны, и, возможно, именно поэтому он работает.Но я не думаю, что у меня есть надлежащие леса на случай, если веб-служба выйдет из строя - скажем, она была отключена из-за отключения электроэнергии?У меня плохое предчувствие, я получу ошибки.Как сделать его более надежным?
Кроме того, первая и вторая веб-службы представляют собой методы LINQ to SQL, заключенные в блоки «using» с помощью TransactionScope, чтобы обеспечить откат методов в случае их сбоя на стороне сервера.
* /
Ссылки 1-3: (как Noob я не могу публиковать более одной ссылки через переполнение стека, поэтому я опубликую только вторую ссылку)
http://old.iserviceoriented.com/blog/post/Indisposable+-+WCF+Gotcha+1.aspx
также см. Www.bluebytesoftware.com /blog/2008/02/18/IDisposableFinalizationAndConcurrency.aspx