2013-03-20 2 views
2

Вот сценарий.Асинхронные вызовы WCF неправильно обрабатываются клиентом

У меня есть приложение WinForm (C#, .NET 3.5), которое следует за шаблоном проектирования Asynchronous Event.

Главный элемент управления (MainResultControl) создает несколько экземпляров дочерних элементов управления (ResultControl) по запросу пользователя. Каждый дочерний элемент управления имеет уникальный набор параметров, который выбирает пользователь.

Каждый дочерний затем вызывает службы WCF асинхронно:

WebServiceClient.GetResultsAsync(Parameters param) 

Каждый дочерний элемент управления также подпишется на GetResultsCompleted случае веб-службы

WebServiceClient.GetResultsCompleted + = _service_GetResultsCompleted()

Здесь проблема, с которой мы сталкиваемся. Пользователи жалуются, что иногда ResultControl отображает неожиданный набор данных - не связанных с запросами.

Возможно ли, что один экземпляр элемента управления получает результаты, которые запрашивал другой экземпляр, когда он обрабатывает событие GetResultsCompleted, поднятое в веб-службе?

спасибо.

Вот некоторые поддержки кода (VB): Родительский контроль (MainResultControl)

Private Sub Submit_Click(ByVal sender As System.Object, _ 
         ByVal e As System.EventArgs) Handles tbSubmit.Click 
    'a copy of MyRequestArgs is created with the details of request' 
    pnlResult.Controls.Add(new ResultsControl(_myRequestArgs)) 
End Sub 

Ребенок управления (ResultsControl):

Public Class ResultsControl 

    Public _webRequestResult As WebRequestResult  

    Public Sub New(ByVal _requestArgs As MyRequestArgs) 

    Dim _service as MyWebService() 
    _service.GetTripSolutionsAsync(New TripPlannerParameters() _ 
          With {.ApplicationID = _requestArgs.ApplicationID, _ 
            .Arrival = _requestArgs.Parameters.Arrival, _ 
            .Destination = _requestArgs.Parameters.Destination}) 
    End Sub 

    Private Sub _service_GetTripSolutionsCompleted(ByVal sender As Object, _ 
               ByVal e As MyWebService.ResultCompletedEventArgs) Handles _service.GetTripSolutionsCompleted 

    'Validation of correct results is done here 
    'Skipped for simplicity 
    _webRequestResult = DirectCast(e.Result, WebRequestResult) 

    End Sub 

End Class 

EDIT:

Я консультировался некоторые люди, и кажется, что WCF имеет некоторые методы обеспечения того, чтобы событие, поднятое из службы, обрабатывалось соответствующим объектом (на клиентской машине), который его повысил. Идея заключается в том, что WCF использует различные IP-сокеты на клиентской машине для множества асинхронных запросов. Это правда?

+0

Добавлен тег VB.Net для видимости подписчиков vb.net. – EtherDragon

ответ

1

Вам необходимо реализовать уникальный маркер запроса.

См. ... I.e. у вас есть элемент управления A, поэтому вам нужно создать уникальный маркер/идентификатор для этого элемента управления и отправить его.

И под методом обратного вызова вы должны вернуть этот маркер/идентификатор, чтобы вы могли фильтровать сообщения в CONTROL.

Лучшим подходом является то, что вы отправите между клиентом/сервером некоторую СООБЩЕНИЕ BOX, чтобы вы могли легко добавить этот идентификатор туда и сообщения об ошибках.

Что-то вроде этого ...

+0

Спасибо Перец. Это имеет смысл для меня. Вы знаете какой-либо дизайн-документ или статью, ссылающиеся на эту проблему? Я просто хочу знать, является ли такое поведение по дизайну - возможность ссылки на результат другим объектом, чем тот, который его запросил. – myroslav

+0

@myroslav Я боюсь, что никаких Документов нет. Доля здесь больше кода для анализа. –