2012-06-18 12 views
5

Śledziłem ten poradnik (przynajmniej na podstawie mojego WCF w to, bo muszę wtedy pracować podobnie): http://www.eggheadcafe.com/tutorials/wcf/b5ada8df-58c5-492f-b368-457b3a4f137c/notify-client-applications-using-wcf-callbacks.aspxJak korzystać z podwójnej usługi WCF przez Internet?

To działa bardzo dobrze na moim komputerze, ale trzeba go używać przez internet. Próbując to zrobić usłyszałem (przez Internet), że lepiej jest użyć netTcpBiding.

Będę miał serwer, który będzie świadomy liczby klientów online. Chciałem usługi WFC na moim IIS na serwerze i usługi windows pochłaniając go i powiadamiając go. Potrzebuję wywołania zwrotnego, na którym serwer musi mieć możliwość wykonania niektórych poleceń na kliencie.

Byłbym bardzo zadowolony, gdyby ktoś mógł mi pomóc.

Dzięki z góry,

Edit:

Making się jasno: nie mogłem zrobić to praca przez Internet. Czy możecie pokazać mi, jak mogę zmienić konfiguracje (Web.config e App.config), aby korzystać z netTcpBinding i pracować przez Internet? znowu

Dzięki,

Edit 2:

Moje Web.config w moim WCFServiceApplication jest:

<?xml version="1.0"?> 
<configuration> 
    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 
    <system.serviceModel> 
    <bindings> 
     <wsDualHttpBinding> 
     <binding name="WSDualHttpBinding_IPCWatcherWCFService" closeTimeout="00:01:00" 
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
      bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
      maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
      messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"> 
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
       maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <reliableSession ordered="true" inactivityTimeout="00:10:00" /> 
      <security mode="Message"> 
      <message clientCredentialType="Windows" negotiateServiceCredential="true" algorithmSuite="Default" /> 
      </security> 
     </binding> 
     </wsDualHttpBinding> 
    </bindings> 
    <services> 
     <service behaviorConfiguration="TiT.PCWatcher.Server.WCFService.Services.PCWatcherWCFServiceBehavior" name="TiT.PCWatcher.Server.WCFService.Services.PCWatcherWCFService"> 
     <endpoint address="" binding="wsDualHttpBinding" bindingConfiguration="WSDualHttpBinding_IPCWatcherWCFService" contract="TiT.PCWatcher.Server.WCFService.Interfaces.IPCWatcherWCFService"> 
      <identity> 
      <dns value="localhost" /> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="TiT.PCWatcher.Server.WCFService.Services.PCWatcherWCFServiceBehavior"> 
      <serviceMetadata httpGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 
</configuration> 

My App.config w moim Usługa Windows jest:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
    <bindings> 
     <wsDualHttpBinding> 
     <binding name="WSDualHttpBinding_IPCWatcherWCFService" closeTimeout="00:01:00" 
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
      bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
      maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" 
      textEncoding="utf-8" useDefaultWebProxy="true"> 
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
      maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <reliableSession ordered="true" inactivityTimeout="00:10:00" /> 
      <security mode="Message"> 
      <message clientCredentialType="Windows" negotiateServiceCredential="true" 
       algorithmSuite="Default" /> 
      </security> 
     </binding> 
     </wsDualHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost:25145/Services/PCWatcherWCFService.svc" 
     binding="wsDualHttpBinding" bindingConfiguration="WSDualHttpBinding_IPCWatcherWCFService" 
     contract="PCWatcherWCFServiceReference.IPCWatcherWCFService" 
     name="WSDualHttpBinding_IPCWatcherWCFService"> 
     <identity> 
      <dns value="localhost" /> 
     </identity> 
     </endpoint> 
    </client> 
    </system.serviceModel> 
</configuration> 

Po prostu zmiana go na netTcpBinding nie działa ...

Ale byłbym zadowolony, że mogę go uruchomić przez Internet ... Opublikowałem WCFService na IIS. Linki:

https://www2.tcenter.com.br/monitor/PCWatcherWCFService.svc

LUB

http://www2.tcenter.com.br:8080/monitor/PCWatcherWCFService.svc

Tylko zmieniając configs jej wystarczających, aby pracować przez internet? jak powiedziałem, lokalny to działa dobrze.

Myślałem, że tylko zmiana adresu punktu końcowego na kliencie do jednego z adresów URL powyżej whould to działa, ale to nie ...

Przykładem, który połączony gospodarzom usługę w WPF. Nie wiem, czy to dotyczy mojego cenario ...

Myślę, że będę trzymać się DualHttpBinding, nie myślisz, że port przesyła to dobrze dla moich potrzeb, mogę mieć dużo klientów w jednym intranecie i mając router, który zadecyduje, który z nich prześle informacje, bo nie jest to dobre? lub jest sposób, aby router odpowiadał poprawnie na każdą maszynę podłączoną do mojego serwera za pośrednictwem tego samego portu ?!(Tylko pytam, hehehe)

Dzięki dużo wcześniej,

zmienił 21/06/2012:

Dzięki za czytanie. Nie mogłem uzyskać usługi do pracy z netTcpBinding w sieci LAN. Zrobiłem próbną próbkę mojego cenario. Jest to here. Nazywany testem DualCommunicationTest.

Kiedy zaczynałem ten post, chciałem tylko wiedzieć, jak sprawić, by to cenario działało w Internecie. Tylko to. Podczas mojego szukania rozwiązania przed opublikowaniem tutaj, przeczytałem, że netTcpBinding jest lepszy. Więc zapytałem o to. To było tylko poboczne pytanie.

... Więc moje obecne potrzeby na stanowisku to:

Jak korzystać the sample i developed w Internecie.

LUB

Jak the sample i developed pracę z netTcpBinding a następnie być w stanie wykorzystać je w internecie. (Jestem całkiem pewna, że ​​Clunky Coder nauczyła mnie drugiej części, jak opublikować net.tcp w Internecie z IIS i innymi rzeczami, dziękuję za to, ale nie byłem w stanie przetestować go jeszcze, ponieważ nie mogłem t jeszcze zrobić netTcp.)

Przepraszam, jeśli nie jestem wystarczająco jasne, mój angielski nie jest tak dobry. sry i jeszcze raz dziękuję, bardzo.

Odpowiedz

5

jest lepszy do komunikacji dwustronnej (komunikacja z oddzwonieniem) i jest bardziej wydajny niż WSDualHttpBinding, który jest preferowanym wiązaniem dla komunikacji dupleksowej przez HTTP. Ale nie powinieneś używać netTcpBinding przez Internet, chociaż technicznie możesz może i to może działać, ale porty, które używa netTcpBinding mogą być (i zwykle są) blokowane przez zapory w Internecie. Wysyłając coś przez Internet, wykonuje wiele przeskoków i przechodzi przez wiele routerów i zapór ogniowych, i nie ma żadnej gwarancji, że te routery i zapory będą miały otwarte wszystkie porty. Ale jeśli możesz otworzyć porty (dla netTcp to jest TCP 808) na punktach końcowych klienta i serwera (zwykle przez przekierowanie portów na routerze) to może działać, ale ogólna rada nie polega na używaniu netTcpBinding przez Internet. Powiedziałem, że użyłem go kilka razy dla moich usług, a moi klienci byli w stanie skonsumować usługę przez Internet bez żadnych problemów - po tym, jak przekazałem porty zarówno klientowi, jak i serwerowi.

Ogólnie komunikacji dupleksu przez internet masz WSDualHttpBinding a jeśli masz klienta Silverlight (Silverlight nie obsługuje WSDualHttpBinding) można użyć PollingDuplexHttpBinding.

Polecam również przeczytać this.

EDIT:

to zmienić przykład do korzystania netTcpBinding, wystarczy zmienić powiązań w pliku konfiguracyjnym użyć netTcpBinding zamiast wsDualHttpBinding. Spójrz na this article, robi to, co opublikował link, z netTcpBinding i więcej wyjaśnień.

EDIT 20/06/2012:

Making się jasno: nie mogłem zrobić to praca przez internet. Czy możecie mi pokazać, w jaki sposób mogę zmienić konfiguracje (Web.config e App.config), aby korzystać z netTcpBinding i pracować przez Internet?

Wydaje się, że jesteś w stanie uzyskać usługę do pracy z netTcpBinding w sieci LAN, dzięki czemu wcześniej problem jest już ustalona, ​​a ty teraz kłopoty hosting usługi w IIS i opublikowanie go w Internecie. Kiedy twoja usługa działa w sieci LAN, będzie działała przez Internet po uruchomieniu go w IIS i przekazywaniu odpowiednich portów na routerach klientów i serwerów, jest to typowy scenariusz i jest dobrze udokumentowany online. Aby to zrobić Musisz hostować swoją usługę jako aplikację na swojej stronie IIS. Musisz upewnić się, że twoja usługa ma plik .svc, który wskazuje lokalizację usługi, a następnie skopiuj zawartość App.Config (plik konfiguracyjny usługi) do nowego pliku web.config (w tym samym katalogu fizycznym, co twój App.config), a także usunąć sekcję <host><baseAddresses> w nowo utworzonym pliku web.config, skierować fizyczną ścieżkę aplikacji do lokalizacji tej usługi na komputerze hosta usługi. Kiedy już to zrobisz, koniecznie edytuj domyślne powiązania z witryną, aby włączyć konkretne powiązania, z których korzysta Twoja usługa, przejdź do: witryny -> "Edytuj wiązania" -> "Dodaj ...", a następnie wybierz sieć .tcp i przypisz mu porty. Następnie w aplikacji przejdź do "Ustawienia zaawansowane" i włącz net.tcp, netTcpBinding usługa będzie zazwyczaj mieć http,net.tcp, ponieważ jest włączona protokoły. Jeśli pojawią się błędy związane z ząbkowaniem, upewnij się, że domyślna pula aplikacji (lub którakolwiek pula aplikacji używa Twojej witryny) ma wymagane uprawnienia dostępu i odczytu fizycznego katalogu na serwerze, na którym znajduje się usługa.

Proszę przeczytać this i this, prosząc mnie o opracowanie, powtórzę tylko to, co mówią.

EDIT 21/06/2012:

Właśnie ściągnąłem swoją usługę i gościł go w IIS i jest obsługiwany w porządku, ponieważ jego użyciu HTTP i nie nettcp to znaczy, że działa perfekcyjnie w Internecie. Jeśli twoja usługa jest czymś prostym i nie spodziewasz się, że zrobisz z nią ciężkie przetwarzanie (patrząc na to, że próbujesz uzyskać listę klientów połączonych z nią), to trzymaj się z wsDualHTTPBinding, ponieważ protokół HTTP będzie działał w w każdym środowisku i nie musisz martwić się zaporami ogniowymi, jak w przypadku netTcpBinding.To wszystko, co zrobił do hosta usługi IIS (i udostępnienie go w internecie):

  1. idź do DefaultWebsite w IIS, kliknij prawym przyciskiem myszy, dodać aplikację, pod Alias ​​tylko dać swoje usługi dowolną nazwę chcesz aby zobaczyć w adresie URL. Wybierz domyślną pulę aplikacji lub pulę aplikacji ASP.NET 4.0.

  2. Skieruj fizyczną ścieżkę do miejsca, w którym znajduje się plik .svc na komputerze; dla mnie jej:

C:\Users\MyPC\Documents\DualCommunicationTest.Server\WcfServiceApp

  1. Pod włączonych protokołów upewnić się, że masz HTTP na porcie 80 lub jakiegokolwiek innego portu, na przykład 8085, ale trzeba będzie do przekazania tego portu na routerze do komputer hosta usługi. Jeśli Twój host usługi znajduje się na IP 192.168.1.4 w twojej sieci LAN, to na routerze do przodu port 80 (lub jakikolwiek port użyjesz - powiedz 8085) do komputera 192.168.1.4.

To takie proste.

+0

Czytanie naprawdę ... ok, nie wiem już, czy idę dla netTcp lub wsDual, ale, czy mógłbyś mi pomóc, aby to działało? Cieszę się, po prostu wstawiając przykład zaimplementowany w powyższym linku do pracy ... –

+0

@ TanielianBarreira, właśnie obejrzałem artykuł, wydaje się dobrze napisany, jaki jest dokładnie problem? Wdraża prostą usługę czatu według jej wyglądu, istnieje wiele przykładów wywołań zwrotnych w WCF. Istota pomysłu polega na tym, że klient wywołuje pewne operacje w usłudze, a usługa może z kolei wywołać metodę na kliencie (jest to wywołanie zwrotne), więc klient tymczasowo będzie jak serwer. Metody w 'ChatService' są tym, co klienci wywołują na serwerze, a metody w' IChatServiceCallback' są tym, co usługa wywołuje na klientach. –

+0

@ TanielianBarreira spójrz na moją aktualizację. –

1

Wiązanie TCP jest lepsze dla wywołań zwrotnych przez Internet, ponieważ protokół TCP jest dwukierunkowy z natury. HTTP to żądanie, to tylko w jedną stronę. Stąd dual w dualHttpBinding. WCF musi utworzyć drugie połączenie HTTP z powrotem do klienta, aby usługa mogła wysyłać żądania do klienta.

Internet nie jest tak skonfigurowany, aby serwery mogły oddzwaniać przez HTTP. Rzeczy takie jak NAT wykonywane przez routery oznaczają, że porty muszą być przekierowywane w celu prawidłowego przekierowania żądania HTTP, a klient musiałby uruchomić serwer HTTP.

O wiele łatwiej jest korzystać z protokołu TCP. Albo to, albo może, żądanie klienta jest obiektem odpowiedzi, który jest przesyłany strumieniowo od końca serwera (niekończąca się odpowiedź), że serwer może uruchamiać powiadomienia w dół. To jednak nie jest proste.

+0

Dziękuję za odpowiedź, ale jak mogę zmienić powyższy przykład, aby użyć netTcp? –

Powiązane problemy