2009-08-07 2 views
0

Ich erstelle derzeit eine benutzerdefinierte Bindung, die HTTP-Anforderungen von einer anderen Quelle als von einem empfangenden TCP-Socket erhält. Wenn ich direkt auf einen Kanal zugreife und ihn öffne, gibt es keine Probleme. Probleme treten jedoch auf, wenn ich versuche, meine Bindung in einem Endpunkt eines WebServiceHost zu hosten.WebServiceHost ruft keinen OnAcceptChannel von benutzerdefiniertem ChannelListener auf

Ich habe Console.WriteLine() Debug-Nachrichten in jede Funktion meines benutzerdefinierten Bindungscodes eingefügt. Alles funktioniert gut, bis die OnOpen() Funktion meines ChannelListener aufgerufen wurde. Anschließend möchte das ServiceModel die OnAcceptChannel() -Methode nicht aufrufen. Keine Ausnahmen, keine Fehlermeldung; es hängt einfach dort und ruft keine andere Funktion meiner Bindung mehr auf. Ich habe die Ausgabe der Anwendung in den folgenden Code kommentiert.

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) 

Hat jemand von euch wissen, was ich in meiner Anwendung ändern haben, dass die OnAcceptChannel Methode richtig aufgerufen wird?

Prost

+0

Der WebServiceHost wird für REST-Style-Anfragen verwendet .... vielleicht ist das das Problem? Was passiert, wenn Sie stattdessen die reguläre ServiceHost-Klasse verwenden? –

+0

Die Bindung [i] sollte [/ i] für REST-Stil-Anforderungen wie das ursprüngliche WebHttpBinding verwendet werden. Das Ändern des WebServiceHost zu ServiceHost behebt das Problem jedoch nicht. Die Ausgabe ist genau gleich. – Etan

Antwort

1

Sind Sie Anrufe auf die Async-Version der ChannelListener Methoden anmelden? Ich scheine mich daran zu erinnern, dass ServiceHost versucht, OnBeginAcceptChannel normalerweise anstelle von OnAcceptChannel aufzurufen.

Fügen Sie außerdem einen Handler an das ServiceHost.Faulted-Ereignis an? Es könnte sein, dass es fehlerhaft ist und Sie nicht unbedingt eine externe Ausnahme während der Eröffnung des Hosts erhalten.

+0

Sie haben Recht. Die Aufrufe der asynchronen Version der Methoden wurden nicht protokolliert. Geschützte Überschreibung System.IAsyncResult OnBeginAcceptChannel (System.TimeSpan-Timeout, System.AsyncCallback-Callback, Objektstatus) { Console.WriteLine ("CHANNELLISTENER: OnBeginAcceptChannel"); werfen neue System.NotImplementedException(); } Ich habe dieses eingefügt und jetzt zeigt es sich. Trotzdem frage ich mich, warum ich keinen Bericht über diese Ausnahme erhalte. Muss ich das manuelle Auslösen solcher Ausnahmen aktivieren? Wenn ja, wo? Vielen Dank für Ihre Antwort! – Etan

+0

Könnte das Ausnahmeproblem lösen. In VS 2008 unter Strg + D, E, musste ich das Kontrollkästchen neben der System.NotImplementedException() aktivieren. – Etan

+0

Alle Ausnahmen dort verursachen den ServiceHost zu Fehler, und das ist, wo Sie diese Information sehen würden. Wie dem auch sei, nun ja, es ist besser, alle Async-Aufrufe zu implementieren, da ServiceHost von ihnen abhängt (nicht nur vom Listener, sondern auch von den Kanälen selbst). – tomasr

Verwandte Themen