WebService/IIS/C# -XML document must have top level element

0

Witam,

Tworze WebService za pomocą Visual C# 2008 (ASP .NET WebService Application). Do uruchomienia webserwisu uzywam serwera IIS na mojm kompie.

W opcjach Visuala zaznaczone mam, aby do uruchamiania webserwisu byl wykorzystany katalog wirtualny IIS (czyli w Project->Settings->Web klikam przycisk "Create Virtual Directory"). W tym momencie do IIS jest dodawany nowy katalog wirtualny wskazujacy na sciezke do mojego projektu, a do webserwisu moge dostac sie poprzez adres http://localhost/service/index.asmx

Nastepny krok to napisanie klienta - tutaj uzywam BCB6, a scislej WDSL Importera. Po imporcie z wsdl wywoluje przykladowa metode webserwisu HelloWorld i wszystko ladnie dziala.

Problem zaczyna sie, gdy chce samodzielnie stworzyc katalog wirtualny i wrzucic do niego zawartosc webserwisu. Tworze recznie wirtualny katalog, z dokladnie takimi samymi ustawieniami. W visualu daje Publish, przerzuca pliki do katalogu na serwerze.
Niestety teraz juz nie da sie uzyc tego webserwisu w Borlandzie - importujac analogicznie wsdl i wywolujac metode dostaje blad:
XML document must have a top level element

Ki diabel? :| to samo jest, gdy probuje sie polaczyc z webserwisem z innego komputera w sieci. O co chodzi?

0

WebService na pewno dziala prawidlowo? errormessage sugeruje ze komunikat zwrotny otrzymany z webservice'a jest ... pusty

0

No wlasnie sam nie wiem, wyglada na to ze rzeczywiscie dostaje pusty xml a raczej klient nie dostaje nic. Na lokalnym komputerze dziala to jak chce - raz tak a raz nie.

Natomiast z innego komputera w sieci nie dziala nawet przez POST (czyli ze stronki webserwisu), bo za kazdym razem wyswietla komunikat, ze metoda jest dostepna tylko z komputera lokalnego...
Szukalem, ale nie wiem gdzie sie to ustawia? To kwestia konfiguracji IIS, czy samego webserwisu?

[edit]
Do web.config dodalem to:

<webServices>
        <protocols>
          <add name="HttpGet"/>
          <add name="HttpPost"/>
          <add name="HttpSoap"/>
        </protocols>
      </webServices>

Teraz przez POST z innego komputera dziala, ale niestety klient (tym razem w C#, nie chce mi sie juz bawic Builderem) łączy się tylko lokalnie.

Klient w C# (localhost dodany jako web reference):

private localhost.MojWebSerwis webserwis = new localhost.MojWebSerwis();

//.........
MessageBox.Show(webserwis.HelloWorld());

Na lokalu ładnie dziala, ale gdy przeniose aplikacje na inny komputer, po probie wywolania metody rzuca mi takim wyjatkiem:

The request failed with HTTP status 405: Method not allowed.

Co to moze byc?

0
othello napisał(a)

No wlasnie sam nie wiem, wyglada na to ze rzeczywiscie dostaje pusty xml a raczej klient nie dostaje nic. Na lokalnym komputerze dziala to jak chce - raz tak a raz nie.

hm.. z tym sie nie spotkalem jeszcze

othello napisał(a)

Natomiast z innego komputera w sieci nie dziala nawet przez POST (czyli ze stronki webserwisu), bo za kazdym razem wyswietla komunikat, ze metoda jest dostepna tylko z komputera lokalnego...
Szukalem, ale nie wiem gdzie sie to ustawia? To kwestia konfiguracji IIS, czy samego webserwisu?

a to jest naturalne. "stronka webservice'u" to stronka testowa. ona jest i bedzie dostepna tylko i wylacznie jesli sie ja odpala z localhosta. zadne zapytanie zewnetrze sie do niej nie dostanie.

othello napisał(a)

Klient w C# (localhost dodany jako web reference):

private localhost.MojWebSerwis webserwis = new localhost.MojWebSerwis();
//.........
MessageBox.Show(webserwis.HelloWorld());

Na lokalu ładnie dziala, ale gdy przeniose aplikacje na inny komputer, po probie wywolania metody rzuca mi takim wyjatkiem:

The request failed with HTTP status 405: Method not allowed.

Co to moze byc?

hm.. sluchaj.. webreference wygenerowal Ci namespace/klase: localhost.MojWebSerwis.. wiec moze po prostu w WebReferences dodales adres pokroju "http://localhost/MojWebSerwis" hmm? przeciez localost na kompie tym-drugim to bedzie ten-drugi komp.. webreference zostaje wyryty w aplikacji tak jak podales i magicznie sie sam nie zmieni. musisz podac IP albo normalną domenową globalną nazwe

0

Racja, glupek ze mnie :P Teraz dziala.

[edit]
Jednak z Buildera nie chce dzialac, wali mi wyjatkiem:

The operation timed out, URL: http://200.0.0.33/index.asmx - SOAPAction:http://200.0.0.33/HelloWorld

1 użytkowników online, w tym zalogowanych: 0, gości: 1