2013-03-20 2 views
2

다음은 시나리오입니다.클라이언트에서 비동기 WCF 호출이 잘못 처리되었습니다.

비동기 이벤트 기반 디자인 패턴을 따르는 WinForm 응용 프로그램 (C#, .NET 3.5)이 있습니다.

주 컨트롤 (MainResultControl)은 사용자가 요청할 때 하위 컨트롤 (ResultControl)의 여러 인스턴스를 만듭니다. 각 자식 컨트롤에는 사용자가 선택하는 고유 한 매개 변수 집합이 있습니다.

WebServiceClient.GetResultsAsync(Parameters param) 

각 자식 컨트롤은 또한 웹 서비스 여기

WebServiceClient.GetResultsCompleted + = _service_GetResultsCompleted()

의 GetResultsCompleted 이벤트에 가입하는 :

각 자식 컨트롤은 비동기 WCF 서비스 호출 우리가 직면하고있는 문제입니다. 사용자는 때때로 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 소켓을 사용합니다. 그게 사실이야?

+0

vb.net 가입자에게 공개 할 VB.Net 태그가 추가되었습니다. – EtherDragon

답변

1

요청의 일부 고유 마커를 구현해야합니다.

참조 ... 예. 당신은 컨트롤 A를 가지고 있습니다, 그래서 당신은 그 컨트롤에 대한 유일한 마커/ID를 만들어 그것을 보내야 만합니다.

콜백 메서드에서 해당 마커/ID를 반환해야 CONTROL 내에서 메시지를 필터링 할 수 있습니다.

가장 좋은 방법은 클라이언트/서버간에 약간의 메시지 상자를 보내면 easly 해당 ID와 오류 메시지를 추가 할 수 있다는 것입니다.

이와 비슷한 것 ...

+0

감사합니다. 그건 나에게 의미가있다. 이 문제를 참조하는 디자인 문서 또는 문서를 알고 계십니까? 그 행동이 의도적으로 설계된 것인지 알고 싶습니다. 결과가 요청한 것과 다른 객체에 의해 참조 될 가능성이 있습니다. – myroslav

+0

@myroslav 문서가 없습니다. 여기서 분석 할 코드를 더 공유하십시오. –