A haben einen WCF-Dienst, der über WCF erreichbar ist (via basicHttpBinding), auf den ich auch von anderen .NET-Diensten auf derselben Maschine mit einer höheren Leistung wie möglich zugreifen möchte. Ich verstehe, dass die netNamedPipeBinding dafür ideal ist, aber wundern Sie sich, was die beste Konfiguration wäre, dass ich nur mit anderen .NET-Prozessen kommunizieren werde.
Zum Beispiel muss ich nicht unbedingt eine Codierung wie SOAP verwenden, da dies vielleicht zu sperrig ist und ich die Kompatibilität mit anderen Clients als einem .NET-Client nicht benötige. Ich glaube auch nicht, dass ich irgendeine Sicherheit brauche.
Was wäre die beste verbindliche Konfiguration für diesen Zweck (oder andere Konfigurationen für diese Angelegenheit)
Ich verstehe, dass das eine ziemlich alte Frage ist, aber es lohnt sich immer noch zu antworten. Wie bereits erwähnt, sind Named Pipes am schnellsten und Sie müssen die Sicherheit deaktivieren, aber den dramatischsten Effekt erhalten Sie, wenn Sie die Serialisierung des Datenvertrags loswerden und in den Stream-basierten Übertragungsmodus wechseln.
Verwenden Sie etwa so etwas als verbindliche Konfiguration:
%Vor%Definieren Sie Ihre Servicemeldungen wie folgt:
%Vor%Der Nachteil dieser Methode ist, dass Sie jetzt Ihre Daten selbst serialisieren müssen. Ich bevorzuge die Verwendung von Protobuf-Serialisierung direkt zu MemoryStream. Platzieren Sie diesen Stream in Ihre CallRequestMessage.Parameters.
Vergessen Sie nicht, ParameterLen / ResultsLen im Nachrichtenheader zu übertragen, da Stream endlos ist (beim Lesen erhalten Sie zwar 0 Bytes, aber im Gegensatz zu normalen Streams sollten Sie weiterlesen).
A haben einen WCF-Dienst, der über WCF erreichbar ist (via basicHttpBinding), auf den ich auch von anderen .NET-Diensten auf derselben Maschine mit einer höheren Leistung wie möglich zugreifen möchte. Ich verstehe, dass die netNamedPipeBinding dafür ideal ist, aber wundern Sie sich, was die beste Konfiguration wäre, dass ich nur mit anderen .NET-Prozessen kommunizieren werde.
Zum Beispiel muss ich nicht unbedingt eine Codierung wie SOAP verwenden, da dies vielleicht zu sperrig ist und ich die Kompatibilität mit anderen Clients als einem .NET-Client nicht benötige. Ich glaube auch nicht, dass ich irgendeine Sicherheit brauche.
Was wäre die beste verbindliche Konfiguration für diesen Zweck (oder andere Konfigurationen für diese Angelegenheit)
Wie Sie bereits festgestellt haben, ist die NetNamedPipeBinding -Bindung für dasselbe optimiert. Maschinenkommunikation:
Bietet eine sichere und zuverlässige Bindung das ist für die Maschine optimiert Kommunikation.
Ref. : vom System bereitgestellte Bindungen
Im ersten Kapitel von Juval Lowys Buch "Programming WCF Services" stellt er ein nützliches Entscheidungsaktivitätsdiagramm für die Wahl der richtigen Bindung zur Verfügung:
"Die erste Frage, die Sie stellen sollten selbst ist, ob deine Dienstleistung benötigt Interaktion mit Nicht-WCF-Clients. Ob Die Antwort ist ja, und wenn der Kunde ist ein Legacy-MSMQ-Client, wählen Sie die MsmqIntegrationBinding, das aktiviert Ihr Service für Interoperabilität über MSMQ mit einem solchen Kunden. Wenn du musst Interoperabilität mit einem Nicht-WCF-Client und Dieser Client erwartet grundlegende Webdienste Protokoll (ASMX Web Services), wählen Sie die BasicHttpBinding, die aufdeckt Ihr WCF-Service für die Außenwelt als wäre es ein ASMX-Webservice (das heißt, ein WSI-Basisprofil). Das Nachteil ist, dass Sie nicht nehmen können Vorteil der meisten modernen WS- * Protokolle. Wenn jedoch die Nicht-WCF Client kann diese Standards verstehen, Wählen Sie eine der WS-Bindungen aus, z WSHttpBindung, WSFederationHttpBinding, oder WSDualHttpBinding. Wenn Sie annehmen können dass der Client noch ein WCF-Client ist es erfordert offline oder getrennt Interaktion, wählen Sie die NetMsmqBinding das verwendet MSMQ zum Transportieren der Mitteilungen. Wenn der Client es benötigt verbundene Kommunikation, könnte aber sein über Maschinengrenzen hinweg anrufen, Wählen Sie die NetTcpBinding das kommuniziert über TCP. Wenn der Kunde ist auf der gleichen Maschine wie der Service, Wählen Sie das NetNamedPipeBinding aus Benutzt Named Pipes um zu maximieren Performance. Sie können die Bindung feineinstellen Auswahl basierend auf zusätzlichen Kriterien wie die Notwendigkeit für Rückrufe (WSDualHttpBinding) oder Verbundsicherheit (WSFederationHttpBinding). "
Sicherlich ist der Named Pipe Transport die beste Wahl.
Transportsicherheit mit EncryptAndSign ist standardmäßig in der standardmäßigen NetNamedPipeBinding-Funktion aktiviert. Sie möchten dies sicherlich entfernen, da dies die Dinge ohne wirkliche Auswirkungen auf die Sicherheit beschleunigen wird, aus den Gründen, warum Ich diskutiere hier .
Ich vermute auch, aber habe noch nicht bestätigt, dass das Ändern des Nachrichtencodierungs-Bindungselements helfen kann. Dies liegt daran, dass der Standardwert das WCF-proprietäre "Binärcodierung mit In-Band-Wörterbuch" ist, das eine Codierung eines XML-Infosets ist, die darauf abzielt, redundante Bytes, z. beim Öffnen und Schließen von Element-Tags: ein wertvolles Ziel, wenn Netzwerk-IO betroffen ist, aber möglicherweise verschwendet CPU-Aufwand, wenn die Nachrichtenübertragung vollständig im Speicher ist (vorausgesetzt, die Nachrichten sind nicht zu groß). Daher könnte eine Änderung in einer reinen Textkodierung auch eine Geschwindigkeitsverbesserung ergeben.
Sicherlich ist der Named Pipe Transport die beste Wahl.
Transportsicherheit mit EncryptAndSign ist standardmäßig in der standardmäßigen NetNamedPipeBinding-Funktion aktiviert. Sie möchten dies sicherlich entfernen, da dies die Dinge ohne wirkliche Auswirkungen auf die Sicherheit beschleunigen wird, aus den Gründen, warum Ich diskutiere hier .
Ich vermute auch, aber habe noch nicht bestätigt, dass das Ändern des Nachrichtencodierungs-Bindungselements helfen kann. Dies liegt daran, dass der Standardwert das WCF-proprietäre "Binärcodierung mit In-Band-Wörterbuch" ist, das eine Codierung eines XML-Infosets ist, die darauf abzielt, redundante Bytes, z. beim Öffnen und Schließen von Element-Tags: ein wertvolles Ziel, wenn Netzwerk-IO betroffen ist, aber möglicherweise verschwendet CPU-Aufwand, wenn die Nachrichtenübertragung vollständig im Speicher ist (vorausgesetzt, die Nachrichten sind nicht zu groß). Daher könnte eine Änderung in einer reinen Textkodierung auch eine Geschwindigkeitsverbesserung ergeben.
Ich verstehe, dass das eine ziemlich alte Frage ist, aber es lohnt sich immer noch zu antworten. Wie bereits erwähnt, sind Named Pipes am schnellsten und Sie müssen die Sicherheit deaktivieren, aber den dramatischsten Effekt erhalten Sie, wenn Sie die Serialisierung des Datenvertrags loswerden und in den Stream-basierten Übertragungsmodus wechseln.
Verwenden Sie etwa so etwas als verbindliche Konfiguration:
%Vor%Definieren Sie Ihre Servicemeldungen wie folgt:
%Vor%Der Nachteil dieser Methode ist, dass Sie jetzt Ihre Daten selbst serialisieren müssen. Ich bevorzuge die Verwendung von Protobuf-Serialisierung direkt zu MemoryStream. Platzieren Sie diesen Stream in Ihre CallRequestMessage.Parameters.
Vergessen Sie nicht, ParameterLen / ResultsLen im Nachrichtenheader zu übertragen, da Stream endlos ist (beim Lesen erhalten Sie zwar 0 Bytes, aber im Gegensatz zu normalen Streams sollten Sie weiterlesen).
Tags und Links wcf c# named-pipes