Do poprawnego 'skonsumowania' serwisu używamy standardowego mechanizmu WCF poprzez "Add Service Reference". Po wpisaniu adresu serwisu (z końcówką ?wsdl) powinniśmy wykryć serwis, a nast. utworzyć na jego podstawie klasę proxy. Gdyby automat nie wykrył usługi, to należy wpisać adres usługi do przeglądarki, a nast. zapisać plik na dysk z rozszerzeniem .xml (i w Add Service Reference podać ścieżkę na dysku gdzie zapisaliśmy ten plik). W przypadku mojej usługi, konieczne było jeszcze zgranie pliku .xsd (na szczęście znajdował się pod tym samym adresem co serwis, tylko z innym rozszerzeniem).
W momencie, gdy mamy utworzoną klasę proxy, możemy spróbować ją wywołać. Niestety w moim przypadku, standardowe wywołanie klasy proxy oznaczało błąd:
„Atrybut System.Xml.Serialization.Poprosiłem więc o pomoc bardziej doświadczone osoby i one zasugerowały mi aby, w miejscu, w którym chcemy wywołać usługę dodać przestrzeń nazw:XmlAttributeAttribute obiektu XmlSerializer nie jest prawidłowy w parametrXYZ. Kiedy atrybut IsWrapped ma wartość true, obsługiwane są tylko atrybuty XmlElement, XmlArray, XmlArrayItem i XmlAnyElement.”
using System.ServiceModela w kodzie aplikacji EndPoint:
EndpointAddress ea = new EndpointAddress("https://abcd/hash/ws/xyz");Posiadając tak wygenerowaną klasę proxy, zasugerowano mi wejść w obiekt "WS" ("go to definition") i tam sprawdzić klasy, które wykorzystują 'parametrXYZ'.
WS ws = new WSClient(new BasicHttpBinding(BasicHttpSecurityMode.Transport), ea);
Okazało się, że faktycznie, były tam dwie klasy, które wykorzystywały taki parametr. Rozwiązaniem tego problemu okazało się przemodelowanie tych klas, poprzez implementację System.ComponentModel.INotifyP
public event System.ComponentModel.Propertyoraz dodanie zmiennych prywatnych każdemu odpowiadającemu mu publicznemu propertisowi, a także usunięcie atrybutu [System.ServiceModel.ChangedEventHandler PropertyChanged;
Przykład poprawnie poprawionej klasy:
Czynność taką powtarzamy dla każdej klasy (i propertisu w tej klasie), w której występuje problematyczny dla nas parametr "parametrXYZ". W moim konkretnym przypadku to wystarczyło, a wywołanie usługi nast. poprzez:[System.Diagnostics.DebuggerStepThroughAttribute()] [System.CodeDom.Compiler.GeneratedCodeAttribute("System. ServiceModel", "4.0.0.0")] [System.ServiceModel.MessageContractAttribute(WrapperName=" parametr-XYZ", WrapperNamespace="http://xyz.pl/ab/xyz", IsWrapped=true)] public partial class xyzRequest : object, System.ComponentModel.INotifyPropertyChanged { private string parametrXYZField;[System.Xml.Serialization.XmlAttributeAttribute("parametr-XYZ")] public string parametrXYZ{get{return this.parametrXYZField;}set{this.parametrXYZField= value;this.RaisePropertyChanged("parametrXYZ");}}public xyzRequest(){}public xyzRequest(string parametrXYZ){this.parametrXYZField = parametrXYZ;}public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; protected void RaisePropertyChanged(string propertyName){System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged; if ((propertyChanged != null)){propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName) ); }}}
string fuu = "Bar";
var raport = ws.pobranieraportu(fuu);
Korzystanie z web serwisów napisanych dla J2EE w .NET może nieść za sobą inne problemy np:
„Element XML 'rezultat-xyz' z obszaru nazw 'http://xyz.pl/ab/xyz' odwołuje się do metody i typu. Zmień nazwę komunikatu metody, używając atrybutu WebMethodAttribute, lub zmień element główny typu, używając atrybutu XmlRootAttribute.”
Powodem błędu jest zastosowanie dla kilku operacji: takiej
samej nazwy typu zwracanego, którą jest „rezultat-xyz”. Technologia
C#/.NET przewiduje obecność tylko unikalnych nazw elementów zwracanych
przez poszczególne operacje.
W
celu wyeliminowania błędu niezbędna jest ręczna modyfikacja
automatycznie wygenerowanej klasy Proxy. Modyfikacja polega na nadaniu
unikalnych nazw elementów zwracanych przez wszystkie operacje dostępne w
WebService, których nazwy elementów zwracanych kolidują ze sobą.
Inne problemy mogą wynikać z niestarannie napisanego XSD, lub innych, trudnych do zidentyfikowania powodów.
Brak komentarzy:
Prześlij komentarz