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.
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.