Шаблон дизайна WCF, необходимый для вложенных асинхронных методов (особенно Silverlight) - PullRequest
0 голосов
/ 17 декабря 2010

Допустим, вы вызываете два метода в 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

1 Ответ

0 голосов
/ 21 ноября 2011

С практической точки зрения я обнаружил, что сборщик мусора прекрасно работает - и обрабатывает любые исключения как можно лучше, обычно на стороне клиента.

...