Es gibt ein echtes Problem mit WSDualHttpBinding
und die Art und Weise, wie die meisten Menschen mit dem Internet verbunden sind - hinter einem Router zu sein, bedeutet, zumindest bei IPv4, dass NAT die Party ruiniert, wie Sie bereits festgestellt haben.
Mit WSDualHttpBinding
haben Sie zwei Verbindungen: Vom Client zum Server und vom Server zum Client.
Normalerweise ist die Verbindung zwischen Client und Server keine große Sache - so läuft die meiste Kommunikation über das Internet ab. In Ihrem Fall scheinen Sie sich hinter einer Firewall zu befinden und haben die benötigten Ports geöffnet bzw. weitergeleitet. Aber das löst nicht das Problem der zweiten Verbindung - vom Server zum Client. Bei dieser zweiten Verbindung verhält sich der Client wie ein Server und der Server wie ein Client. Sie müssen also bei jedem einzelnen Client, der sich mit Ihrem Dienst verbindet, dieselbe Portöffnung/Weiterleitung vornehmen, da er ebenfalls als Server fungiert! Dies ist natürlich eine Zumutung für jeden Nutzer Ihres Dienstes. Deshalb ist es WSDualHttpBinding
ist eher für die Kommunikation von Server zu Server geeignet, bei der die Einrichtung eine einmalige Angelegenheit ist.
Anstatt zu versuchen, die WSDualHttpBinding
zu arbeiten, schlage ich vor, dass Sie zu NetTcpBinding
. Da beide WSDualHttpBinding
y NetTcpBinding
nur WCF, nur Microsoft, proprietäre Verbindungsschemata sind, verlieren Sie nicht viel in Bezug auf die Interoperabilität. Was Sie hingegen gewinnen, ist eine ganze Menge:
NetTcpBinding
verwendet nur eine einzige Verbindung, vom Client zum Server, und ermöglicht eine zweiseitige Kommunikation wie WSDualHttpBinding
. Es besteht also keine Notwendigkeit, sich mit der Öffnung/Weiterleitung von Ports auf der Client-Seite zu befassen - NAT ist kein Problem.
- Das Kommunikationsprotokoll ist binär und ist kompakter als das in
WSDualHttpBinding
. Weniger Datenübertragung bedeutet einen leistungsfähigeren Dienst.
- Mit
NetTcpBinding
können Sie sofort benachrichtigt werden, wenn ein Client die Verbindung trennt, da ein Socket geschlossen wird. Sie brauchen nicht auf ein HTTP-Timeout zu warten, wie es bei WSDualHttpBinding
.
- Eine einzige Verbindung bedeutet, dass nichts aus dem Gleichlauf geraten kann - mit
WSDualHttpBinding
Wenn eine der beiden Verbindungen unterbrochen wird, während die andere noch aktiv ist, kann die Kommunikation nur in eine Richtung erfolgen. WCF hat eine Möglichkeit, damit umzugehen, aber es ist besser, das Problem von vornherein zu vermeiden.
Umschalten auf NetTcpBinding
erfordert in der Regel nur eine Konfigurationsänderung - der Code bleibt derselbe. Es ist einfach, es ist schnell, es ist viel weniger mühsam und vor allem - es funktioniert einfach.