2008-12-19 8 views
9

Ich habe eine mobile Plattform, die ich versuche, einige Kommunikationscode zu schreiben.Wie schreibe ich einen Socket-basierten benutzerdefinierten Transport für WCF

Die Plattform bietet einen proprietären Kommunikationsmechanismus, der auf Standard-Socket-Funktionen basiert. Im Prinzip sieht die Socket-API der Plattform genauso aus wie die Standard-Windows-Socket-API, abgesehen von einem Präfix für jede der Funktionen.

Ich möchte WCF verwenden, um die Komplexität der Sockets API weg von meinen Anwendungen zu abstrahieren, aber es fällt mir schwer, Ressourcen zu finden, die alle Teile, die codiert werden müssten, angemessen beschreiben.

Kann jemand einen guten Startplatz empfehlen, oder beschreiben Sie, was notwendig wäre, um einen benutzerdefinierten Socket-basierten Transport für WCF zu schreiben? Im Idealfall möchte ich HttpBinding über diesen Transportmechanismus verwenden können.

Danke!

Antwort

10

Ich habe eine Liste von einigen resources zum Schreiben eines WCF-Transport-Kanäle, die nützlich sein könnten. Nicht alle Links sind leider immer noch aktiv, aber die meisten sind und da sind einige nützliche Dinge drin.

Ich legte auch eine short introduction, wie einige der Stücke zusammenpassen, die ein wenig helfen könnte.

Etwas, was ich nicht ganz in Ihrer Frage verstehe: Sie erwähnen, dass Sie die HttpBinding auf Ihrem Transport ausführen möchten. Meinst du, dass Sie den WCF http-Transportkanal über Ihre benutzerdefinierte Socket-ähnliche API anstelle der normalen Windows-Sockets-API verwenden möchten?

Wenn ja, dann nein, das wird aus verschiedenen Gründen nicht funktionieren. Eine davon ist, dass die Bindungen und Kanäle nicht wirklich direkt miteinander verbunden sind. Stattdessen bestimmt die Bindungsdefinition (d. H. Welche Bindungselemente darin enthalten sind), wie der Kanalstapel zur Laufzeit für Ihren Dienst/Client erstellt wird.

Wenn Sie also Ihren benutzerdefinierten Transportkanal schreiben, erstellen Sie Ihre eigene benutzerdefinierte TransportBindingElement-abgeleitete Klasse, die Sie in einer benutzerdefinierten Bindung verwenden können, um einen eigenen Transportkanal anstelle eines der Standardtransportkanäle (wie HttpTransport) zu verwenden. Beachten Sie jedoch, dass ein Transportkanal auf jeden Fall die Unterseite des Channel-Stacks ist (dh darunter ist nichts), so dass Sie den HttpTransport trotzdem nicht über Ihren benutzerdefinierten Transport legen können (selbst wenn die API-Beschränkung nicht vorhanden war). .

Mit anderen Worten, wenn Sie HTTP sprechen möchten, müssen Sie die HTTP-Zeug in Ihrer benutzerdefinierten Kanalimplementierung backen. Nichts hindert Sie jedoch daran, den Rest der standardmäßigen Basis/ws-http-Bindungen über Ihrem eigenen Kanal zu verwenden, vorausgesetzt, Sie geben die richtigen Kanalformen frei.

+0

sehr schöne Post und Links! –

+1

oben funktioniert nicht. – vikky

Verwandte Themen