Uruchomieniem serwera za pomocą ServiceHost.

0

Witam. Piszę aplikację klient-serwer za pomocą WCF i mam problem z ServiceHost.

                address = new Uri("http://" + ip + ":" + port + "/Server");
                host = new ServiceHost(typeof(Service1), address);
                host.AddServiceEndpoint(typeof(IService1), new BasicHttpBinding(), address);
                host.Open(); 

IP jest wczytywane z pliku. Serwer się uruchamia jeśli ip jest localhost, ale jeśli wpiszę swoje IP np 178.37.106.9 to serwer się wysypuje. Dlaczego? Najdziwniejsze jest jeszcze to, że kiedy zamienię napis localhost na 127.0.01 to również serwer się sypie. Dlaczego tak jest i jak temu zaradzić?

1

A sypie się z wyjątkiem jakim?
Sprawdź na prawach administratora. HttpListener nie potrafi się zabindować do czegokolwiek poza localhost bez podwyższonych uprawnień.

0

Dostaję takie coś:

Exception "Nie można nawiązać połączenia, ponieważ komputer docelowy aktywnie go odmawia" (System.Net.Sockets.SocketException)
A System.Net.Sockets.SocketException was thrown: "Nie można nawiązać połączenia, ponieważ komputer docelowy aktywnie go odmawia"

Exception "Nie można połączyć się z serwerem zdalnym" (System.Net.WebException)
A System.Net.WebException was caught: "Nie można połączyć się z serwerem zdalnym"
Time: 2014-05-09 2032
Thread:<No Name>[2000]

Exception "W elemencie http://77.254.159.132:5000/Server brak nasłuchującego punktu końcowego, który mógłby odebrać komunikat. Jest to często spowodowane niepoprawnym adresem lub akcją protokołu SOAP. Sprawdź właściwość InnerException (jeśli jest obecna), aby uzyskać więcej szczegółowych informacji." (System.ServiceModel.EndpointNotFoundException)
A System.ServiceModel.EndpointNotFoundException was thrown: "W elemencie http://77.254.159.132:5000/Server brak nasłuchującego punktu końcowego, który mógłby odebrać komunikat. Jest to często spowodowane niepoprawnym adresem lub akcją protokołu SOAP. Sprawdź właściwość InnerException (jeśli jest obecna), aby uzyskać więcej szczegółowych informacji."

Takie błędy dostaję teraz. Wcześniej dostawałem w innym miejscu tam przy tworzenie new ServiceHost. Teraz wywala powyższe błędy przy próbie pierwszego wykonania zdalnej metody serwisu np:

service.setAlgorithm(1);

I zaczeło działać dla localhost jako tekstu jak i dla liczb 127.0.0.1, ale jeśli wpiszę swoje IP to się sypie nadal: 77.254.159.132

Pomoże ktoś?

1

Tutaj widać, jakby problemem był fakt, że on nie może podłączyć się z serwerem pod adresem podanym wyżej. Jeżeli jest to twoje IP, ale jesteś za NAT-em, to musisz przekierować porty na odpowiedni komputer. Ewentualnie, sprawdzić ustawienia firewalla. Czegoś nie rozumiem - te wyjątki wyskakują, kiedy wywołujesz metodę zdalnego serwisu?

Po drugie, serwer musi się zbindować na odpowiednie IP - masz to ustawione? Oczywiście wykonujesz metodę Open(), aby w ogóle uruchomić nasłuchiwanie?

0

@Ktos wszystko robię w ten sposób jak w pierwszym poście przedstawiłem:

address = new Uri("http://" + ip + ":" + port + "/Server");
                host = new ServiceHost(typeof(Service1), address);
                host.AddServiceEndpoint(typeof(IService1), new BasicHttpBinding(), address);
                host.Open();  

Tak, błąd wywala przy pierwszym wywołaniu metody zdalnego serwisu. Firewalla nie mam ani żadnego antywirusa. Dla localhost oraz 127.0.0.1 wszystko działa.

1

Nie napisałeś z jakiego systemu korzystasz. Jeżeli Windows 7 i nowszy to problemem podejrzewam będzie tutaj fakt iż IPv6 w tych systemach ma priorytet przed IPv4. Jeżeli tak, wyłącz IPv6 lub odinstaluj go całkowicie i sprawdź wtedy. mam bardzo podobny kod i u mnie działa.
http://support.microsoft.com/kb/929852/pl

0

Hmm. Teraz widzę, że aplikacja serwera, która tworzy ServiceHost działa tam wszystko. Tylko jak klienckie wywołują metody wywala błędy. To moje ustawienia w kliencie:

                address = new Uri("http://" + txtIP.Text.ToString() + ":" + txtPort.Text.ToString() + "/Server");
                EndpointAddress epoint = new EndpointAddress(address);
                service = ChannelFactory<WcfServiceLibrary1.IService1>.CreateChannel(new BasicHttpBinding(), epoint);
1

Znalazłem w Internecie bardzo prosty przykład WCF (http://www.codeproject.com/Tips/642296/Hello-World-Basic-Server-Client-Example-of-WCF) i odpaliłem. Napisany w VB, ale nie jest to problem. Wymagał praw administratora, bo binduje się do +:8000 (do wszystkich adresów IP, na porcie 8000), mimo, że niby kod mówi jak u ciebie:

selfHost.AddServiceEndpoint(GetType(myLib.IService1), New BasicHttpBinding(), New Uri("http://localhost:8000/SayHelloService"))

Nie wiem dlaczego w takiej koncepcji nie binduje się do localhost tylko, ale trudno.

Po odpaleniu na drugim komputerze błąd identyczny jak u ciebie - nie można się podłączyć, bo komputer aktywnie odmawia połączenia (connection refused).
Zmieniłem ustawienia firewalla - mam standardowy firewall w Windows - dodając wyjątek dla portu 8000. I nagle zaczyna działać (a potem jest zupełnie inny błąd - nie można pobrać metadanych). Więc może naprawdę sprawdź z wyłączonym firewallem, albo sobie dodaj wyjątek dla tego jednego portu...

netsh advfirewall firewall add rule name="Test 8000" dir=in action=allow protocol=TCP localport=8000

Jeżeli potem będziesz miał błąd, że nie można dodać serwisu, bo nie można znaleźć metadanych, to spróbuj adresów postaci http://<twoje ip>:8000/SayHelloService?singleWsdl.
IPv6 nie powinien mieć znaczenia (nawiasem mówiąc, nie działa na IPv6 - istnieje sobie tam strona internetowa, ale zwraca błąd 404).

0

Eh. Przepraszam za zamieszanie. Wszystkiemu winna moja głupota i lenistwo. Mam Netię i żeby sprawdzić swoje ip po prostu wchodziłem np. na strone: http://twojeip.wp.pl/?ticaid=112b79 i spisywałem IP, ale to jest chyba IP zewnętrzne. Dopiero przed chwilą mi się to przypomniało, że mam jeszcze wewnętrzne, sprawdziłem ipconfig/all. Wpisałem IP wewnętrzne i program działa. Dzięki za chęć pomocy.

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