Ich habe seit ein paar Tagen mit einem Problem mit unseren WPF-Anwendungen gekämpft und ich frage mich, ob jemand schon einmal darauf gestoßen ist und helfen kann? Das Problem scheint auf den Client herunterzufallen, der "on-the-fly" einen Serializer generiert, um die Typen in diesem Webmethodenaufruf zu verarbeiten. Wenn diese Methode zum ersten Mal aufgerufen wird (der Web-Dienst selbst wurde bereits ausgeführt), kann es z. 8 Sekunden können nachfolgende Anrufe z.B. 20ms. Die CPU im Client-WPF-Prozess ist während dieser Verzögerung v.Verwendung von WCF aus WPF sehr langsam bei der ersten Verwendung
Wenn Sie den XmlSerializer verwenden, können Sie diese Serializer-Assemblys mit svcutil vorgenerieren. Wenn (wie wir) den normalen WCF DataContractSerializer verwenden, scheint diese Option nicht vorhanden zu sein.
Was ich möchte, ist in der Lage, diese Baugruppe für alle Typen in allen meinen Datenverträgen (viel) vorzugenerieren oder alternativ diesen Prozess durch einen benutzerdefinierten zu ersetzen, den ich kodieren kann und die Daten weitergibt binär (wir besitzen beide Enden dieses Webservice/Clients und sie sind beide .NET 4). Ich habe bereits BinaryFormtter und GZip-Komprimierung verwendet, und während dies die Übertragung von Daten beschleunigt, wird es immer wieder in XML wiederhergestellt, um durch das Framework deserialisiert zu werden, daher bleibt dieses Problem bestehen.
Irgendwelche Ideen?
Danke Julien, ich habe useDefaultWebProxy false bereits. Ich habe versucht, protobuf-net zu verwenden, aber ich habe Schwierigkeiten zu verstehen, ob ich alle meine Datentypen mit einem neuen Attribut neu dekorieren muss - ich hoffe nicht. Es sagt auf der Website, dass v2 "ohne Attribute verwendet werden kann, wenn Sie möchten", aber alle Beispiele verwenden Attribute. Wird dies die Startgeschwindigkeit des ersten Anrufs sogar in IIS verbessern (was wirklich vorgeschrieben ist), d. H. Ist der Protobuf-Net-Serializer zum Zeitpunkt der Erstellung vorgeneriert? –
@SimonEvans, solange Sie die 'Order'-Eigenschaft auf jedem' DataMember 'gesetzt haben, sollte es Ihnen gut gehen. Habe es allerdings nicht selbst benutzt (ich ging von Anfang an mit protobuf). –
Julien, meinst du ich müsste [ProtoMember (n)] zu jedem öffentlichen Eigentum hinzufügen? Danke für Ihre Hilfe –