Pirx - 29 Cze 2007, 16:41
Witam wszystkich serdecznie. Framework wersja 2.0. Web Service służy do komunikacji tego systemu na platformie .NET z appletem Java (wywoływanym ze strony WEB w ASP w tymże systemie). Po stronie Javy korzystam z Xfire a dokładniej z pluginu do MyEclipse do generacji klienta Web Service w technologii XFire. Plugin generuje klasy proxy w Javie na podstawie URL'a do WSDL'a wyżej wymienionego Web Service w C#. Do tej pory wszystko dziłało mi OK gdy metody Web Service zwracały tablice byte[] lub listy generyczne. Chciałem jednak dodać metodę, która zwraca mi DataSet z platformy .NET. Oto kod tej metody z WS C#:
//Metoda pobiera dane procesu Flash o podanym IdProcess z tabeli: pr_pr_procesy (w przypadku błędu zwraca wyjątek) [WebMethod] public DataSet pobierzDaneProcesuFlashPoId(int idProcess) { //Zdefiniuj zwracany Dataset DataSet zwracanyDS = new DataSet();
//Utwórz i otwórz połączenie SQL i zdefiniuj transakcję SQL SqlConnection conn = new SqlConnection(this.connS); conn.Open();
try { //Tworzymy SQL command do pobrania procesu Flash z tabeli: pr_procesy SqlCommand cmd = new SqlCommand("ProcessJava_PobierzDaneProcesuFlash", conn, sqltrans); cmd.CommandType = CommandType.StoredProcedure;
//Sprawdź poprawność i wypelnij parametry dla procedury składowanej SQL
if (idProcess < 0) ThrowSoapException("Brak parametru id procesu Flash!");
//Utwórz DataAdapter this.sqlDataAdapter = new SqlDataAdapter(cmd);
//Wypełnij DataSet Danymi procesu Flash z tabeli: pr_procesy NND this.sqlDataAdapter.Fill(zwracanyDS); } catch (Exception e) { //Nie udało się pobrać danych procesu Flash z bazy NND - zgłaszamy wyjątek do klienta ThrowSoapException("Nie udało się pobrać danych procesu Flash!\nPrzyczyna: " + e.Message); } finally { //Zamknij połączenie SQL conn.Close(); }//try-catch
//Zwróć wypełniony DS return zwracanyDS;
}//pobierzDaneProcesuFlashPoId
Po dodaniu tej metody plugin do Eclipse nie potrafi na podstawie WSDL'a do Web Service wygenerować klas Java dla klienta w XFire. Stąd ma klika pytań: 1) Czy można jakoś za pomocą annotacji opisać typ .NET DataSet tak, aby WSDL generowany przez Visual Studio 2005 opisywał ten typ tak aby jego definicja była czytelna dla klienta Java w XFire. Robiłem to w innym systemie w odwrotną stronę (Web Service w Java JAX-WS i klient w MS.NET) i typ DataSet był poprawnie przesyłany bez jakichś dodatkowych zabiegów. 2) Czy w ogóle w technologii XFire ma to szansę zadziałać? 2) Czy znacie jakieś programy - analizatory składni WSDL, które po sparsowaniu WSDL'a potrafią powiedzieć mi jak są widziene typy zwracane przez metody WS?
Będę wdzięczny za jakiekolwiek sugestie w tym temacie.
Pozdrawiam Pirx.
Mateusz Ludwin - 29 Cze 2007, 16:56
pl.comp.lang.java.getSenderByName("*Pirx*").quote(); Będę wdzięczny za jakiekolwiek sugestie w tym temacie.
A może zacznij od pokazania tego WSDL-a? :
Pirx - 29 Cze 2007, 17:14
pl.comp.lang.java.getSenderByName("*Pirx*").quote(); | Będę wdzięczny za jakiekolwiek sugestie w tym temacie.
A może zacznij od pokazania tego WSDL-a? :
OK oto wygenerowany przez VS WSDL: <?xml version="1.0" encoding="utf-8" ? - <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://tkomp.pl/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://tkomp.pl/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" - <wsdl:types - <s:schema elementFormDefault="qualified" targetNamespace="http://tkomp.pl/" - <s:element name="HelloWorld" <s:complexType / </s:element - <s:element name="HelloWorldResponse" - <s:complexType - <s:sequence <s:element minOccurs="0" maxOccurs="1" name="HelloWorldResult" type="s:string" / </s:sequence </s:complexType </s:element - <s:element name="zapiszProcesBezTytulu" - <s:complexType - <s:sequence <s:element minOccurs="1" maxOccurs="1" name="idProcess" type="s:long" / <s:element minOccurs="0" maxOccurs="1" name="xml" type="s:base64Binary" / </s:sequence </s:complexType </s:element - <s:element name="zapiszProcesBezTytuluResponse" <s:complexType / </s:element - <s:element name="pobierzXMLProcesuPoIdProcesu" - <s:complexType - <s:sequence <s:element minOccurs="1" maxOccurs="1" name="idProcess" type="s:long" / </s:sequence </s:complexType </s:element - <s:element name="pobierzXMLProcesuPoIdProcesuResponse" - <s:complexType - <s:sequence <s:element minOccurs="0" maxOccurs="1" name="pobierzXMLProcesuPoIdProcesuResult" type="s:base64Binary" / </s:sequence </s:complexType </s:element - <s:element name="zapiszProcesZTytulem" - <s:complexType - <s:sequence <s:element minOccurs="1" maxOccurs="1" name="idProcess" type="s:long" / <s:element minOccurs="0" maxOccurs="1" name="xml" type="s:base64Binary" / <s:element minOccurs="0" maxOccurs="1" name="tytul" type="s:string" / </s:sequence </s:complexType </s:element - <s:element name="zapiszProcesZTytulemResponse" <s:complexType / </s:element - <s:element name="zapiszLubAktualizujProcesBezTytulu" - <s:complexType - <s:sequence <s:element minOccurs="1" maxOccurs="1" name="idProcess" type="s:long" / <s:element minOccurs="0" maxOccurs="1" name="xml" type="s:base64Binary" / </s:sequence </s:complexType </s:element - <s:element name="zapiszLubAktualizujProcesBezTytuluResponse" <s:complexType / </s:element - <s:element name="kasujProces" - <s:complexType - <s:sequence <s:element minOccurs="1" maxOccurs="1" name="idProcess" type="s:long" / </s:sequence </s:complexType </s:element - <s:element name="kasujProcesResponse" <s:complexType / </s:element - <s:element name="zapiszKonfiguracjeUzytkownika" - <s:complexType - <s:sequence <s:element minOccurs="1" maxOccurs="1" name="idUser" type="s:int" / <s:element minOccurs="0" maxOccurs="1" name="xmlKonf" type="s:base64Binary" / </s:sequence </s:complexType </s:element - <s:element name="zapiszKonfiguracjeUzytkownikaResponse" <s:complexType / </s:element - <s:element name="pobierzKonfiguracjeProcesowPoIdUsera" - <s:complexType - <s:sequence <s:element minOccurs="1" maxOccurs="1" name="idUser" type="s:int" / </s:sequence </s:complexType </s:element - <s:element name="pobierzKonfiguracjeProcesowPoIdUseraResponse" - <s:complexType - <s:sequence <s:element minOccurs="0" maxOccurs="1" name="pobierzKonfiguracjeProcesowPoIdUseraResult" type="s:base64Binary" / </s:sequence </s:complexType </s:element - <s:element name="zapiszLubAktualizujProcesZTytulem" - <s:complexType - <s:sequence <s:element minOccurs="1" maxOccurs="1" name="idProcess" type="s:long" / <s:element minOccurs="0" maxOccurs="1" name="xml" type="s:base64Binary" / <s:element minOccurs="0" maxOccurs="1" name="tytul" type="s:string" / </s:sequence </s:complexType </s:element - <s:element name="zapiszLubAktualizujProcesZTytulemResponse" <s:complexType / </s:element - <s:element name="pobierzListeIdProcesowFlash" <s:complexType / </s:element - <s:element name="pobierzListeIdProcesowFlashResponse" - <s:complexType - <s:sequence <s:element minOccurs="0" maxOccurs="1" name="pobierzListeIdProcesowFlashResult" type="tns:ArrayOfInt" / </s:sequence </s:complexType </s:element - <s:complexType name="ArrayOfInt" - <s:sequence <s:element minOccurs="0" maxOccurs="unbounded" name="int" type="s:int" / </s:sequence </s:complexType - <s:element name="pobierzListeIdProcesowJava" <s:complexType / </s:element - <s:element name="pobierzListeIdProcesowJavaResponse" - <s:complexType - <s:sequence <s:element minOccurs="0" maxOccurs="1" name="pobierzListeIdProcesowJavaResult" type="tns:ArrayOfLong" / </s:sequence </s:complexType </s:element - <s:complexType name="ArrayOfLong" - <s:sequence <s:element minOccurs="0" maxOccurs="unbounded" name="long" type="s:long" / </s:sequence </s:complexType - <s:element name="pobierzDaneProcesuFlashPoId" - <s:complexType - <s:sequence <s:element minOccurs="1" maxOccurs="1" name="idProcess" type="s:int" / </s:sequence </s:complexType </s:element - <s:element name="pobierzDaneProcesuFlashPoIdResponse" - <s:complexType - <s:sequence - <s:element minOccurs="0" maxOccurs="1" name="pobierzDaneProcesuFlashPoIdResult" - <s:complexType - <s:sequence <s:element ref="s:schema" / <s:any / </s:sequence </s:complexType </s:element </s:sequence </s:complexType </s:element </s:schema </wsdl:types - <wsdl:message name="HelloWorldSoapIn" <wsdl:part name="parameters" element="tns:HelloWorld" / </wsdl:message - <wsdl:message name="HelloWorldSoapOut" <wsdl:part name="parameters" element="tns:HelloWorldResponse" / </wsdl:message - <wsdl:message name="zapiszProcesBezTytuluSoapIn" <wsdl:part name="parameters" element="tns:zapiszProcesBezTytulu" / </wsdl:message - <wsdl:message name="zapiszProcesBezTytuluSoapOut" <wsdl:part name="parameters" element="tns:zapiszProcesBezTytuluResponse" / </wsdl:message - <wsdl:message name="pobierzXMLProcesuPoIdProcesuSoapIn" <wsdl:part name="parameters" element="tns:pobierzXMLProcesuPoIdProcesu" / </wsdl:message - <wsdl:message name="pobierzXMLProcesuPoIdProcesuSoapOut" <wsdl:part name="parameters" element="tns:pobierzXMLProcesuPoIdProcesuResponse" / </wsdl:message - <wsdl:message name="zapiszProcesZTytulemSoapIn" <wsdl:part name="parameters" element="tns:zapiszProcesZTytulem" / </wsdl:message - <wsdl:message name="zapiszProcesZTytulemSoapOut" <wsdl:part name="parameters" element="tns:zapiszProcesZTytulemResponse" / </wsdl:message - <wsdl:message name="zapiszLubAktualizujProcesBezTytuluSoapIn" <wsdl:part name="parameters" element="tns:zapiszLubAktualizujProcesBezTytulu" / </wsdl:message - <wsdl:message name="zapiszLubAktualizujProcesBezTytuluSoapOut" <wsdl:part name="parameters" element="tns:zapiszLubAktualizujProcesBezTytuluResponse" / </wsdl:message - <wsdl:message name="kasujProcesSoapIn" <wsdl:part name="parameters" element="tns:kasujProces" / </wsdl:message - <wsdl:message name="kasujProcesSoapOut" <wsdl:part name="parameters" element="tns:kasujProcesResponse" / </wsdl:message - <wsdl:message name="zapiszKonfiguracjeUzytkownikaSoapIn" <wsdl:part name="parameters" element="tns:zapiszKonfiguracjeUzytkownika" / </wsdl:message - <wsdl:message name="zapiszKonfiguracjeUzytkownikaSoapOut" <wsdl:part name="parameters" element="tns:zapiszKonfiguracjeUzytkownikaResponse" / </wsdl:message - <wsdl:message name="pobierzKonfiguracjeProcesowPoIdUseraSoapIn" <wsdl:part name="parameters" element="tns:pobierzKonfiguracjeProcesowPoIdUsera" / </wsdl:message - <wsdl:message name="pobierzKonfiguracjeProcesowPoIdUseraSoapOut" <wsdl:part name="parameters" element="tns:pobierzKonfiguracjeProcesowPoIdUseraResponse" / </wsdl:message - <wsdl:message name="zapiszLubAktualizujProcesZTytulemSoapIn" <wsdl:part name="parameters" element="tns:zapiszLubAktualizujProcesZTytulem" / </wsdl:message - <wsdl:message name="zapiszLubAktualizujProcesZTytulemSoapOut" <wsdl:part name="parameters" element="tns:zapiszLubAktualizujProcesZTytulemResponse" / </wsdl:message - <wsdl:message name="pobierzListeIdProcesowFlashSoapIn" <wsdl:part name="parameters" element="tns:pobierzListeIdProcesowFlash" / </wsdl:message - <wsdl:message name="pobierzListeIdProcesowFlashSoapOut" <wsdl:part name="parameters" element="tns:pobierzListeIdProcesowFlashResponse" / </wsdl:message - <wsdl:message name="pobierzListeIdProcesowJavaSoapIn" <wsdl:part name="parameters" element="tns:pobierzListeIdProcesowJava" / </wsdl:message - <wsdl:message name="pobierzListeIdProcesowJavaSoapOut" <wsdl:part name="parameters" element="tns:pobierzListeIdProcesowJavaResponse" / </wsdl:message - <wsdl:message name="pobierzDaneProcesuFlashPoIdSoapIn" <wsdl:part name="parameters" element="tns:pobierzDaneProcesuFlashPoId" / </wsdl:message - <wsdl:message name="pobierzDaneProcesuFlashPoIdSoapOut" <wsdl:part name="parameters" element="tns:pobierzDaneProcesuFlashPoIdResponse" / </wsdl:message - <wsdl:portType name="ServiceMainSoap" - <wsdl:operation name="HelloWorld" <wsdl:input message="tns:HelloWorldSoapIn" / <wsdl:output message="tns:HelloWorldSoapOut" / </wsdl:operation - <wsdl:operation
... więcej »
Pirx - 29 Cze 2007, 17:20
pl.comp.lang.java.getSenderByName("*Pirx*").quote(); | Będę wdzięczny za jakiekolwiek sugestie w tym temacie.
A może zacznij od pokazania tego WSDL-a? :
Zwracany bład przez plugin Eclipse : Error generating JAXB model. Może to też będzie pomocne.
Pozdrawiam Pirx.
Mateusz Ludwin - 29 Cze 2007, 17:44
pl.comp.lang.java.getSenderByName("*Pirx*").quote(); OK oto wygenerowany przez VS WSDL:
To nawet nie jest XML, zapisz to w XML-u i zlinkuj a nie wklejaj tego tutaj.
Marcin - 30 Cze 2007, 05:33
| pl.comp.lang.java.getSenderByName("*Pirx*").quote(); | Będę wdzięczny za jakiekolwiek sugestie w tym temacie.
| A może zacznij od pokazania tego WSDL-a? :
Zwracany bład przez plugin Eclipse : Error generating JAXB model.
Komunikat o błędzie sugeruje że na podstawie WSDL nie można było utworzyć obiektu: według mnie nieprawidłowy WSDL (inaczej: niezrozumiały dla pluginu który tworzy obiekt). Poza tym to o ile mi się wydaje to przy pomocy protokołu SOAP można przekazywać typy proste. A obiekt klasy DataSet z .NET takim typem nie jest. Jeżeli mogę coś doradzić to DataSet ma metodę GetXML(): będziesz mógł przekazać wtedy xml do apletu a w aplecie zostanie Ci parsowanie XML. Aby sobie uprościć możesz zastosować wspomniany wyżej JAXB Pozdrawiam marcin
Pirx - 30 Cze 2007, 05:56
pl.comp.lang.java.getSenderByName("*Pirx*").quote(); | OK oto wygenerowany przez VS WSDL:
To nawet nie jest XML, zapisz to w XML-u i zlinkuj a nie wklejaj tego tutaj.
Zgadza się to nie jest czysty XML tylko WSDL. Prosiłeś o WSDL'a więc Ci go przesłałem w takiej postaci w jakiej jest generowany przez Web Serwice. Dzięki za uwagę, następnym razem wystawię link.
Pozdrawiam Pirx.
Pirx - 30 Cze 2007, 06:06
| pl.comp.lang.java.getSenderByName("*Pirx*").quote(); | Będę wdzięczny za jakiekolwiek sugestie w tym temacie.
| A może zacznij od pokazania tego WSDL-a? :
| Zwracany bład przez plugin Eclipse : Error generating JAXB model.
Komunikat o błędzie sugeruje że na podstawie WSDL nie można było utworzyć obiektu: według mnie nieprawidłowy WSDL (inaczej: niezrozumiały dla pluginu który tworzy obiekt). Poza tym to o ile mi się wydaje to przy pomocy protokołu SOAP można przekazywać typy proste. A obiekt klasy DataSet z .NET takim typem nie jest. Jeżeli mogę coś doradzić to DataSet ma metodę GetXML(): będziesz mógł przekazać wtedy xml do apletu a w aplecie zostanie Ci parsowanie XML. Aby sobie uprościć możesz zastosować wspomniany wyżej JAXB
Pozdrawiam marcin
Dzięki za konstruktywną odpowiedź. WIem, że WSDL potrafi opisywać DataSet tak, aby był poprawnie odbierany przez klienta. Robiłem to w JAX-WS, tylko w drugą stronę (Typed DataSEt z Java do .NET) i działało to bez problemu. Tak samo w zwracać DataSet i klient bez problemupotrafi zidentyfikować jego typ (w wielu aplikacjach na tej platformie to wykorzystuję). Co do parsowania XML'a to jest to bardziej skomplikowane niż zwrócenie listy obiektów klasy opakowującej dla danych które chciałem zwracać przez DataSet'y. Poszukam jeszcze jakichś materiałów w sieci, a jak nic nie znajdę to zrobię sobie prostą klasę opakowującą dane. Dziękuję wszystkim za odpowiedzi.
Pozdrawiam Pirx.
Marcin - 30 Cze 2007, 06:25
| pl.comp.lang.java.getSenderByName("*Pirx*").quote(); | | Będę wdzięczny za jakiekolwiek sugestie w tym temacie.
| A może zacznij od pokazania tego WSDL-a? :
| Zwracany bład przez plugin Eclipse : Error generating JAXB model.
| Komunikat o błędzie sugeruje że na podstawie WSDL nie można było | utworzyć obiektu: według mnie nieprawidłowy WSDL (inaczej: | niezrozumiały dla pluginu który tworzy obiekt). Poza tym to o ile mi | się wydaje to przy pomocy protokołu SOAP można przekazywać typy | proste. A obiekt klasy DataSet z .NET takim typem nie jest. | Jeżeli mogę coś doradzić to DataSet ma metodę GetXML(): będziesz mógł | przekazać wtedy xml do apletu a w aplecie zostanie Ci parsowanie XML. | Aby sobie uprościć możesz zastosować wspomniany wyżej JAXB
| Pozdrawiam | marcin
Dzięki za konstruktywną odpowiedź. WIem, że WSDL potrafi opisywać DataSet tak, aby był poprawnie odbierany przez klienta. Robiłem to w JAX-WS, tylko w drugą stronę (Typed DataSEt z Java do .NET) i działało
problemu metoda Web Service może zwracać DataSet i klient bez problemupotrafi zidentyfikować jego typ (w wielu aplikacjach na tej platformie to wykorzystuję). Co do parsowania XML'a to jest to bardziej skomplikowane niż zwrócenie listy obiektów klasy opakowującej dla danych które chciałem zwracać przez DataSet'y. Poszukam jeszcze jakichś materiałów w sieci, a jak nic nie znajdę to zrobię sobie prostą klasę opakowującą dane.
Zainteresuj się projektem Apache JaxMe lub Apache Bitwext. Jeżeli to jest DataSet który ma zawsze taką samą strukturę to w Javie napiszesz sobie klasę i poprostu załadujesz do niej XML z DataSetem ( używając Bitwext). Aby użyć JaxMe trzeba najpierw wygenerować schemat xmla i wtedy na jego podstawie zostaną utworzone klasy Javy. Dziękuję wszystkim za odpowiedzi.
Pozdrawiam Pirx.
pozdrawiam Marcin
Pirx - 30 Cze 2007, 06:37
Zainteresuj się projektem Apache JaxMe lub Apache Bitwext. Jeżeli to jest DataSet który ma zawsze taką samą strukturę to w Javie napiszesz sobie klasę i poprostu załadujesz do niej XML z DataSetem ( używając Bitwext). Aby użyć JaxMe trzeba najpierw wygenerować schemat xmla i wtedy na jego podstawie zostaną utworzone klasy Javy. | Dziękuję wszystkim za odpowiedzi.
| Pozdrawiam Pirx.
pozdrawiam Marcin
Dzięki to jest bardzo dobry pomysł - właśnie czegoś takiego potrzebowałem. Przesyłam też linka z częściowym wyjaśnieniem i rozwiązaniem problemu, który znalazłem w sieci (może przyda się innym): http://forums.java.net/jive/message.jspa?messageID=204995
TYVM Pirx.
Mateusz Ludwin - 30 Cze 2007, 08:40
pl.comp.lang.java.getSenderByName("*Pirx*").quote(); Zgadza się to nie jest czysty XML tylko WSDL. Prosiłeś o WSDL'a więc Ci go przesłałem w takiej postaci w jakiej jest generowany przez Web Serwice.
To nie jest WSDL, tylko tekst przeklejony z IExplorera!
Robert Winkler - 30 Cze 2007, 13:29
[...] WIem, że WSDL potrafi opisywać DataSet tak, aby był poprawnie odbierany przez klienta. Robiłem to w JAX-WS, tylko w drugą
metoda Web Service może zwracać DataSet i klient bez problemupotrafi zidentyfikować jego typ (w wielu aplikacjach na tej platformie to wykorzystuję). Co do parsowania XML'a to jest to bardziej skomplikowane niż zwrócenie listy obiektów klasy opakowującej dla danych które chciałem zwracać przez DataSet'y. Poszukam jeszcze jakichś materiałów w sieci, a jak nic nie znajdę to zrobię sobie prostą klasę opakowującą dane.
Pozwolicie że wtrące moje "dwa grosze". Próbowałeś może z na wyjściu procedury zamiast zwykłego DataSet wysłać z WS typowany dataset?
Jeśli procedura na serwerze zwraca tylko jeden resultset to Visual Studio potrafi za ciebie przygotować DataTable nadając mu nazwe procedury w ramach twojego dataset i umieszczając w nim pełną informacje o zwracanych kolumnach. Jesli tabel jest więcej to wymagać to będzie troche pracy ręcznej ale w rezultacie otrzymasz w twoim pliku WSDL informacje o tym iż XMLSchema twoje DataSetu dostępna jest dla klienta, np: <s:import namespace=http://mojafirma.pl/MyTypedDataSet.xsd / <s:import schemaLocation=http://serwer.firma.pl/myservice.asmx?schema=MyTypedDataSet namespace="http://mojafirma.pl/MyTypedDataSet.xsd" /
Definiując procedure, np: [WebMethod] public MyTypedDataSet pobierzDaneDoKlienta(int procesId) {...} nadal w WSDL'u zwracanym typem będzie 'any' ale tym razem z informacją jaki jest schemat tego "any" <s:any namespace="http://mojafirma.pl/MyTypedDataSet.xsd" /
Nigdy nie miałem kontaktu z Xfire, ale może to pomoże mu w prawidłowej interpretacji twojego WSDL'a
Pirx - 30 Cze 2007, 15:07
Zainteresuj się projektem Apache JaxMe lub Apache Bitwext. Jeżeli to jest DataSet który ma zawsze taką samą strukturę to w Javie napiszesz sobie klasę i poprostu załadujesz do niej XML z DataSetem ( używając Bitwext). Aby użyć JaxMe trzeba najpierw wygenerować schemat xmla i wtedy na jego podstawie zostaną utworzone klasy Javy. | Dziękuję wszystkim za odpowiedzi.
| Pozdrawiam Pirx.
pozdrawiam Marcin
Użyłem JaxMe2 - działa bardzo dobrze na podstawie schemy XML (wygenerowanej za pomocą metody DataSet.GetDataSetSchema w C#) build Anta wygenerował mi wszystkie potrzebne klasy, działa też instancjonowanie obiektów tych klas z XML'a przesłanego Web Servicem (wygenerowanego po stronie .Net metodą: GetXml). Jeszcze raz dziękuję za bardzo trafną podpowiedź.
Pozdrawiam Pirx.
Pirx - 30 Cze 2007, 15:14
Pozwolicie że wtrące moje "dwa grosze".
Próbowałeś może z na wyjściu procedury zamiast zwykłego DataSet wysłać z WS typowany dataset?
Jeśli procedura na serwerze zwraca tylko jeden resultset to Visual Studio potrafi za ciebie przygotować DataTable nadając mu nazwe procedury w ramach twojego dataset i umieszczając w nim pełną informacje o zwracanych kolumnach. Jesli tabel jest więcej to wymagać to będzie troche pracy ręcznej ale w rezultacie otrzymasz w twoim pliku WSDL informacje o tym iż XMLSchema twoje DataSetu dostępna jest dla klienta, np: <s:import namespace=http://mojafirma.pl/MyTypedDataSet.xsd / <s:import schemaLocation=http://serwer.firma.pl/myservice.asmx?schema=MyTypedDataSet namespace="http://mojafirma.pl/MyTypedDataSet.xsd" /
Definiując procedure, np: [WebMethod] public MyTypedDataSet pobierzDaneDoKlienta(int procesId) {...} nadal w WSDL'u zwracanym typem będzie 'any' ale tym razem z informacją jaki jest schemat tego "any" <s:any namespace="http://mojafirma.pl/MyTypedDataSet.xsd" /
Nigdy nie miałem kontaktu z Xfire, ale może to pomoże mu w prawidłowej interpretacji twojego WSDL'a
Podejrzewam, że kolega ma rację, przeprowadzę test i postaram się odpowiesdzieć, jaki był rezultat (nie wiem czy zdążę jeszcze dzisiaj). Na razie przyjąłem rowziązanie z JaxMe2, które mnie satysfakcjonuje (jeszcze raz dzięki dla Marcina za podpowiedź), głównie z tego względu, że mogę wszystko budować automatycznie, nie wymaga to żadnych "ręcznych" interwencji. Jednak sam pomysł jest jak najbardziej godny polecenia. Serdecznie dziękuję za odpowiedź.
Pozdrawiam Pirx.
Bye, bye Java
JAVA_HOME, JRE_HOME
Interfejs COM -> JNI -> Interfejs java
'java.lang.NoClassDefFoundError' i nie tylko...
mobilne gadu oraz inspiro problem
dyplom grilowania
2222andrzej skaznik2222 karaoke
wilcza glowa
nokia 5300 vs se k750i
krzysztof waligora
themesy dla symbiana 3rd download 40
obwod wologodzki
charakterystyka kazimierza wielkiego
Zbieranina wiadomości z for dyskusyjnych || Indeks
|