2008-09-16 2 views
2

Ich habe eine WPF-Anwendung in VS 2008 mit einigen Web-Service-Referenzen. Aus verschiedenen Gründen (maximale Nachrichtengröße, Authentifizierungsmethoden) muss ich einige Einstellungen in der app.config des WPF-Clients für die Service-Bindungen manuell definieren.Visual Studio basicHttpBinding und Endpunkt Probleme

Leider bedeutet dies, dass, wenn ich die Service-Referenzen im Projekt aktualisieren wir am Ende mit einer Unordnung - mehrere Bindungen und Endpunkte. Visual Studio erstellt neue Bindungen und Endpunkte mit einem numerischen Suffix (z. B. "Service1" als Duplikat von "Service"), was zu einer ungültigen Konfiguration führt, da in einem Projekt möglicherweise nur eine einzelne Bindung pro Serviceverweis vorhanden ist.

Dies ist einfach zu duplizieren - erstellen Sie einfach eine einfache "Hello World" ASP.Net-Webdienst und WPF-Anwendung in einer Lösung, ändern Sie die maxBufferSize und maxReceivedMessageSize in der app.config Bindung und aktualisieren Sie dann die Service-Referenz.

Momentan arbeiten wir daran, indem wir die App.config nach dem Aktualisieren der Referenzen einfach auschecken, aber ich kann nicht anders, als zu denken, dass es einen besseren Weg geben muss!

Auch die Einstellungen müssen wir manuell ändern sind:

<security mode="TransportCredentialOnly"> 
    <transport clientCredentialType="Ntlm" /> 
</security> 

und:

<binding maxBufferSize="655360" maxReceivedMessageSize="655360" /> 

Wir haben eine Service-Fabrik-Klasse verwenden, so dass, wenn diese Einstellungen irgendwie in der Lage sind, eingestellt werden programmatisch das wäre Arbeit, obwohl die Eigenschaften scheinen nicht ausgesetzt zu sein.

Antwort

2

Erstellen Sie eine .Bat-Datei, die SVCutil für die Proxygenerierung verwendet, die über die für Ihr Projekt richtigen Einstellungen verfügt. Es ist ziemlich einfach. Klicken Sie auf die batfile, um neue proxyfiles zu erzeugen, wann immer die Schnittstelle geändert wurde.

Die Charge kann später in automatisierten Builds verwendet werden. Dann müssen Sie die app.config (oder web.config) nur einmal einrichten. Im Allgemeinen trennen wir die verschiedenen Konfigurationen für verschiedene Umgebungen, wie z. B. Entwickler, Testprod.

Beispiel (achten Sie auf Zeilenumbrüchen):

REM generate meta data 
call "SVCUTIL.EXE" /t:metadata "MyProject.dll" /reference:"MyReference.dll" 

REM making sure the file is writable 
attrib -r "MyServiceProxy.cs" 

REM create new proxy file 
call "SVCUTIL.EXE" /t:code *.wsdl *.xsd /serializable /serializer:Auto /collectionType:System.Collections.Generic.List`1 /out:"MyServiceProxy.cs" /namespace:*,MY.Name.Space /reference:"MyReference.dll" 

:)

// W

+0

Danke superwren - das sieht aus wie es den Trick tun könnte. – Nathan

0

Irgendwie bevorzuge ich die Verwendung von svcutil.exe direkt als die Funktion "Add Service Reference" von Visual Studio zu verwenden: P Dies ist, was wir in unseren WCF-Projekten tun.

0

Ich nehme Ihren Punkt, SVUCUTIL ist definitiv der erweiterte Weg zum Hinzufügen und Aktualisieren von Service-Referenzen. Es ist nur ein bisschen mehr manuelle Arbeit, wenn "Rechtsklick, Update-Referenz" ist so nahe daran, nur in einem einzigen Schritt zu arbeiten.

Ich denke, wir könnten einige Batch-Dateien oder etwas erstellen, um nur den Referenzcode auszugeben. Selbst dann wird das manuelle Auschecken und Aktualisieren des Dienstcodes mit svcutil wahrscheinlich mehr Arbeit machen, als nur das Auschecken auf der Konfiguration rückgängig zu machen.

Danke für die Beratung auf jeden Fall.

2

Anstatt die erzeugte Endpunkt zu ändern, könnte uou einen zweiten Endpunkt und Binde Definition mit dem Add Konfiguration, die Sie benötigen, und geben Sie in Ihrem Code einfach den Namen des neuen Endpunkts in Ihren Service-Client-Konstruktor ein.

0

Wir überprüfen (aus der Quellcodeverwaltung) die app.config- und * .cs-Dateien, die automatisch vom Dienstprogramm svcutil.exe generiert werden, und führen dann eine Batchdatei aus, in der svcutil.exe ausgeführt wird, um den Dienst abzurufen Metadaten. Wenn es fertig ist, kompilieren wir den Code neu, stellen Sie sicher, dass es funktioniert, und überprüfen Sie dann die aktualisierten app.config und * .cs Dateien wieder. Es ist viel zuverlässiger als die häufig verwendete "Add Service Reference" mit Visual Studio zu verwenden.