Web Service C#.NET i klient Web Service w Java - XFire.

Oglądasz archiwalną wersję wątku "Web Service C#.NET i klient Web Service w Java - XFire." z forum pl.comp.lang.java



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