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

Вот сценарий.

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

Основной элемент управления (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

РЕДАКТИРОВАТЬ:

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

1 ответ

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

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

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

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

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

Другие вопросы по тегам