WCF Services in Silverlight einbinden

Wieder einmal eine Frage aus meinem Silverlight Kurs. Der Teilnehmer will zwei WFC Services in ein Projekt einbinden. Dazu verwendet er das Werkzeug slsvcutil um die Proxy Klassen zu erzeugen. Ich würde das einfach per Visual Studio und durch hinzufügen einer Service Reference lösen.

Im Silverlight Projekt Service Referenz hinzufügen.

image

Man erhält dann eine Menge Dateien. Der erzeugte Code enthält dann auch die Propertys:

 <System.Runtime.Serialization.DataMemberAttribute()>  _
        Public Property Region() As String
            Get
                Return Me.RegionField
            End Get
            Set
                If (Object.ReferenceEquals(Me.RegionField, value) <> true) Then
                    Me.RegionField = value
                    Me.RaisePropertyChanged("Region")
                End If
            End Set
        End Property

Zunächst also einmal der erste Versuch einen Proxy zu generieren. Das Tool befindet sich bei mir in C:\Program Files\Microsoft SDKs\Silverlight\v4.0\Tools. Der Aufruf für mich als VBler

slsvcutil http://localhost:1892/Service2.svc?wsdl /language:VB

Un dann schon die ernüchternde Fehlermeldung.

Process is terminated due to StackOverflowException

Liegt daran das ich kein US System habe. Workaround durch anlegen der config Datei beschrieben hier.

http://blogs.msdn.com/b/silverlightws/archive/2010/04/30/workaround-for-stackoverflowexception-when-using-slsvcutil-exe.aspx

Die Proxy Klasse weist aber leichte Unterschiede auf. So werden Arrays statt ObservableCollection erzeugt. Keine InotifyPropertychanged Interfaces Implementiert und es gibt keine automatischen Namensraum Anpassungen. Das kann durchaus erwünscht sein, da so die WCF Kommunikation etwas leicht gewichtiger wird. Der Code für ein Property sieht dann so aus im Vergleich zu vorher.

 <System.Runtime.Serialization.DataMemberAttribute()>  _
        Public Property Region() As String
            Get
                Return Me.RegionField
            End Get
            Set
                Me.RegionField = value
            End Set
        End Property

 

Die erzeugte Klassendatei wird einfach dem Silverlight Projekt hinzugefügt.

Wenn man das ursprüngliche Verhalten möchte dann führt folgende Syntax zum Erfolg.

slsvcutil http://localhost:1892/Service2.svc?wsdl /edb
/namespace:"*,SilverlightApplication1.ServiceReference1"
/ct:System.Collections.ObjectModel.ObservableCollection`1
/r:"%PROGRAMFILES%\Reference Assemblies\Microsoft\Framework\Silverlight\v3.0\System.Windows.dll"
/language:VB

Grundsätzlich sehe ich keine Grund, die Kommandozeilen Variante zu wählen.

Kommentar schreiben