2009-08-07 3 views
0

현재 청취중인 TCP 소켓과 다른 소스에서 HTTP 요청을 가져 오는 사용자 지정 바인딩을 만들고 있습니다. 채널에 직접 액세스하여 열 때 아무런 문제가 없습니다. 그러나 WebServiceHost의 끝점에서 바인딩을 호스트하려고하면 문제가 발생합니다.WebServiceHost가 사용자 지정 ChannelListener의 OnAcceptChannel을 호출하지 않습니다.

내 맞춤 바인딩 코드의 모든 기능에 Console.WriteLine() 디버그 메시지를 삽입했습니다. 내 ChannelListener의 OnOpen() 함수가 호출 될 때까지 모든 것이 잘 작동합니다. 그런 다음 ServiceModel은 OnAcceptChannel() 메서드를 호출하기를 원하지 않습니다. 예외도없고 오류 메시지도 없습니다. 그것은 단지 거기에 걸려 있고 더 이상 제 바인딩의 다른 기능을 호출하지 않습니다. 아래 코드에 응용 프로그램의 출력을 주석으로 표시했습니다.

WebServiceHost host = new WebServiceHost(
    typeof(MyService), new Uri("http://localhost:80")); 
host.AddServiceEndpoint(typeof(MyService), new MyWebHttpBinding(), ""); 
// BINDING CONSTRUCTOR 
// BINDINGELEMENT CONSTRUCTOR 
host.Open(); 
// BINDING: CreateBindingElements (multiple times) 
// BINDINGELEMENT: Clone 
// BINDINGELEMENT CONSTRUCTOR 
// BINDINGELEMENT: CanBuildChannelListener 
// BINDINGELEMENT: Clone 
// BINDINGELEMENT CONSTRUCTOR 
// BINDINGELEMENT: CanBuildChannelListener 
// BINDINGELEMENT: Clone 
// BINDINGELEMENT CONSTRUCTOR 
// BINDINGELEMENT: Clone 
// BINDINGELEMENT CONSTRUCTOR 
// BINDINGELEMENT: Clone 
// BINDINGELEMENT CONSTRUCTOR 
// BINDINGELEMENT: BuildChannelListener 
// CHANNELLISTENER CONSTRUCTOR 
// BINDINGELEMENT: Clone 
// BINDINGELEMENT CONSTRUCTOR 
// BINDING: CreateBindingElements (multiple times) 
// CHANNELLISTENER: OnOpen 
// CHANNELLISTENER: OnOpen END (function completes properly. last output) 

내 응용 프로그램에서 OnAcceptChannel 메서드가 올바르게 호출되면 무엇을 변경해야 하는지를 아는 사람이 있습니까?

건배

+0

WebServiceHost는 REST 스타일 요청에 사용됩니다 .... 아마도 그게 문제입니까? 대신에 정규 ServiceHost 클래스를 사용한다면 어떨까요? –

+0

원본 WebHttpBinding과 같이 REST 스타일 요청에 바인딩 [i]을 사용해야합니다. 그러나 WebServiceHost를 ServiceHost로 변경해도 문제가 해결되지 않습니다. 출력은 정확히 동일합니다. – Etan

답변

1

당신은 ChannelListener 방법의 비동기 버전에 대한 호출을 기록하고 있습니까? OnAcceptChannel 대신 OnBeginAcceptChannel을 호출하려고하는 ServiceHost를 기억하는 것 같습니다.

또한 ServiceHost.Faulted 이벤트에 처리기를 연결하고 있습니까? 오류가 있으며 호스트를 여는 동안 외부 예외를 반드시 가져올 필요는 없습니다.

+0

당신이 옳습니다. 메서드의 비동기 버전에 대한 호출을 로깅하지 않았습니다. 보호 된 오버라이드 System.IAsyncResult OnBeginAcceptChannel (System.TimeSpan 제한 시간, System.AsyncCallback 콜백, 개체 상태) { Console.WriteLine ("CHANNELLISTENER : OnBeginAcceptChannel"); 새로운 System.NotImplementedException()를 throw합니다. } 삽입했는데 표시됩니다. 그럼에도 불구하고이 예외에 대한 보고서를받지 못한 이유가 궁금합니다. 수동으로 그러한 예외를 던지도록 할 수 있습니까? 그렇다면 어디에서? 답변 해 주셔서 감사합니다. – Etan

+0

예외 문제를 해결할 수 있습니다. VS 2008에서 Ctrl + D, E 아래에서 System.NotImplementedException() 옆의 확인란을 활성화해야했습니다. – Etan

+0

거기서 예외가 발생하면 ServiceHost에 결함이 생기고 그 정보를 볼 수 있습니다. 나머지는, 네, ServiceHost가 리스너뿐만 아니라 채널 자체에 의존하기 때문에 모든 비동기 호출을 구현하는 것이 좋습니다. – tomasr