오늘 .NET의 다른 네트워킹 모델과 관련되어 있지만 WCF 질문이 있습니다.WCF : DuplexSessionChannel, 비동기 작업 및 예외
OneWay = true 인 Send (Message) OperationContract를 노출하는 WCF 서비스가 있습니다. 이제이 서비스에는 클라이언트에게 메시지를 반환하는 콜백 채널이 있습니다.
어쨌든 (성공적으로) 내 클라이언트에서이 Send 메서드를 비동기 적으로 호출하려고합니다. DuplexSessionChannel에서 BeginSend (Message, OnSendComplete, null)를 호출하고 있고 DuplexSessionChannel에서 EndSend (asyncResult)를 호출하는 OnSendComplete (IAsyncResult) 메서드가 있습니다.
서비스에는 CallbackContract가 있으며 클라이언트에 다시 전송하기 위해 동일한 BeginSend()/EndSend() 패턴이 사용됩니다.이 패턴은 OperationContext.Current.GetCallbackChannel에서 얻은 callBack 채널에서 호출됩니다.
DuplexSessionChannel의 클라이언트는 서비스 콜백 채널에서 메시지를받을 때 BeginReceive()/EndReceive()를 호출합니다.
일들이 실제로 작동하더라도 실제로 <Operation>
(끝) 메서드가 수행하는 내용을 이해하지 못하고 이것이 나에게 설명해야 할 내용입니다.
콜렉션이 수정되었음을 불평하는 서비스 (클라이언트에게 다시 보내기)에 대한 EndSend() 호출에서 가끔 예외가 발생하므로 요청합니다. (이 예외의 의미는 무엇인지는 알지만 왜 그런지는 알지 못합니다. 일어나는 곳 또는 정확히 ...). Silverlight 클라이언트에서 PollingDuplexHttpBinding을 사용하고 있습니다.
저는 WCF 전문가가 아니지만 세부 정보를 갖고 있지는 않습니다. 지식이 필요합니다. 지금까지 필자는 다른 비동기 작업을 시작하기 전에 이러한 종류의 Begin/End 패턴을 보았지만 실제로 어떤 일이 벌어지고 있는지 전혀 이해하지 못했습니다.
미리 감사드립니다.
IDuplexSessionChannel.BeginSend 및 EndSend에는 다음과 같은 서명이 있습니다. IAsyncResult BeginSend (Message, AsyncCallback, object) void EndSend (IAsyncResult); BeginSend에 전달 된 AsyncCallback 대리자에 의해 호출되는 콜백 메서드 내부에서 EndSend를 호출합니다. EndSend()가 void를 반환한다고 가정 할 때, 나는 그것이 무엇인지 이해하지 못한다. "결과"는 BeginSend AsyncCallback에서 볼 수 있습니다. 또한 BeginSend AsyncCallback에 의해 비동기 적으로 반환 될 때 BeginSend가 IAsyncResult를 반환하는 이유를 이해하지 못합니다. – MrLane
Brians가 내가이 질문을 게시 한 후 몇 달 후에 다시 읽으면이 패턴으로 훨씬 더 명확 해집니다. Juval Lowery가 프로그래밍 한 WCF 책은 이것을 잘 설명합니다. 나는 여전히 예외의 원인을 모르고 있지만 EndAnd()를 더 이상 호출하지 않아 제거되었습니다. 어쨌든 결과는 반환되지 않습니다. 이것이 좋은 연습인지 (아마도 예외적 인 세부 사항이 누락 될 수는 있겠는가) 모르겠다. 그러나이 책은 생략 될 수 있다고 제안하는 것처럼 보이고 제거하는 것이 훨씬 더 효과적이기 때문이다. – MrLane