Вопрос по wsdualhttpbinding, wcf, nettcpbinding, callback – Как использовать WCF Dual Service через Интернет?

5

Я следовал этому руководству (по крайней мере, на этом основывался мой WCF, потому что тогда мне нужно работать одинаково): http://www.eggheadcafe.com/tutorials/wcf/b5ada8df-58c5-492f-b368-457b3a4f137c/notify-client-applications-using-wcf-callbacks.aspx

Он очень хорошо работает на моем компьютере, но мне нужно использовать его через Интернет. При попытке сделать это я услышал (через Интернет), что лучше использовать netTcpBiding.

У меня будет сервер, который будет знать о количестве клиентов в сети. Мне нужен был сервис WFC на моем IIS на сервере, а сервис Windows использовал и уведомлял об этом. Мне нужен обратный вызов, потому что сервер иногда должен выполнять некоторые команды на клиенте.

Я был бы очень рад, если бы кто-нибудь мог мне помочь.

Заранее спасибо,

Edit:

Я проясняю: я просто не мог заставить это работать через Интернет. Ребята, можете ли вы показать мне, как я могу изменить свои конфигурации (Web.config e App.config), чтобы использовать netTcpBinding и работать через Интернет?

Еще раз спасибо,

Edit 2:

Мой Web.config в моем приложении WCFServiceApplication:

<?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>

Мой App.config в моем WindowsService:

<?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>

Просто изменить его на NetTcpBinding не работает ...

Но я был бы достаточно рад, чтобы иметь возможность запустить это через Интернет ... Я опубликовал WCFService на IIS. Ссылки:

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

ИЛИ ЖЕ

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

Просто измените настройки достаточно, чтобы заставить его работать через Интернет? как я уже сказал, местный он работает просто отлично.

Я думал, что простое изменение адреса конечной точки на клиенте на один из вышеуказанных URL-адресов может сработать, но это не сработало ...

Пример, который вы связали, размещает службу в WPF. Я не знаю, относится ли это к моему кенарио ...

Я думаю, что я буду придерживаться DualHttpBinding, вы не думаете, что переадресация порта хороша для моих нужд, у меня может быть много клиентов в одной интрасети, и маршрутизатор решает, с кем он собирается отправить информацию для этого не подходит? или есть способ заставить маршрутизатор корректно реагировать на каждую машину, подключенную к моему веб-серверу через один и тот же порт ?! (просто спрашиваю, хе-хе)

Заранее большое спасибо,

Edit on 21/06/2012:

Спасибо за чтение. Мне не удалось заставить сервис работать с netTcpBinding в локальной сети. Я сделал пробный образец моего кенарио. Это & APOS; sВот, Называется DualCommunicationTest.

Когда я начал этот пост, я просто хотел узнать, как сделать этот кенарий в интернете. Только то. В течение моего времени поиска решения, прежде чем писать здесь, я читал, что netTcpBinding лучше. Поэтому я спросил об этом. Это был просто побочный вопрос.

Итак ... мои текущие потребности в должности:

Как пользоватьсяобразец, который я разработал в Интернете.

ИЛИ ЖЕ

Как сделатьобразец, который я разработал работать с netTcpBinding и затем иметь возможность использовать его в Интернете. (Я уверен,Неуклюжий кодер научил меня второй части, о том, как публиковать net.tcp в интернете с IIS и прочим, большое спасибо за это, но я пока не смог его протестировать, потому что я еще не смог сделать netTcp.)

Прошу прощения, если я не достаточно ясен, мой английский не очень хорош. спасибо и еще раз большое спасибо.

Ваш Ответ

2   ответа
1

Привязка TCP лучше подходит для обратных вызовов через Интернет, поскольку по своей природе TCP является двунаправленным. HTTP это запрос, это только один путь. Отсюда двойственное в dualHttpBinding. WCF должен создать второе HTTP-соединение с клиентом, чтобы служба могла отправлять запросы клиенту.

Интернет на самом деле не настроен для серверов, чтобы перезвонить через HTTP. Такие вещи, как NAT, выполняемый маршрутизаторами, означает, что порты должны быть перенаправлены для правильной маршрутизации HTTP-запроса, и клиент должен будет использовать HTTP-сервер.

Таким образом, гораздо проще использовать TCP. Либо это, либо, возможно, клиент запросил объект ответа, который передается потоком от конца сервера (действующий бесконечный ответ), чтобы сервер мог отправлять уведомления. Это не просто, хотя.

Спасибо за ваш ответ, но как я могу изменить приведенный выше пример для использования netTcp? Tanielian V. Barreira
5

netTcpBinding лучше для дуплексной связи (связь с обратными вызовами) и является более производительным, чемWSDualHttpBinding которая является предпочтительной привязкой для дуплексной связи по HTTP. Но вы не должны использоватьnetTcpBinding через интернет, хотя вы техническиcan и это может работать, но порты, которыеnetTcpBinding использование может быть (и обычно) заблокировано брандмауэрами в Интернете. Когда вы отправляете что-то через Интернет, это делает много прыжков и проходит через множество маршрутизаторов и брандмауэров, и нет никакой гарантии, что на этих маршрутизаторах и брандмауэрах будут открыты все порты. Но если вы можете открыть порты (для netTcp это TCP 808) как на клиентских, так и на серверных конечных точках (обычно это делается путем переадресации портов на маршрутизаторе), это может сработать, но общий совет не использоватьnetTcpBinding по Интернету. Сказав, что я использовал его пару раз для своих услуг, и мои клиенты смогли использовать службу через Интернет без каких-либо проблем - после того, как я переадресовал порты как на клиенте, так и на сервере.

В общем, для дуплексной связи через Интернет у вас естьWSDualHttpBinding и если у вас есть клиент Silverlight (Silverlight не поддерживаетWSDualHttpBinding) ты можешь использоватьPollingDuplexHttpBinding.

Я также рекомендую вам прочитатьэтот.

EDIT:

Чтобы изменить этот пример, чтобы использоватьnetTcpBindingпросто измените привязки в конфигурационном файле, чтобы использоватьnetTcpBinding вместоwsDualHttpBinding, Посмотри наЭта статья, он делает то, что делает ссылка, которую вы разместили, сnetTcpBinding и больше объяснений.

EDIT 20/06/2012:

Making myself clear: I just could not make it work over the internet. Can you guys show me how can i change my configurations (Web.config e App.config) to use netTcpBinding and work over the internet?

Кажется, вы смогли заставить сервис работать сnetTcpBinding в локальной сети ваша прежняя проблема теперь устранена, и у вас теперь возникают проблемы с размещением службы в IIS и публикацией ее в Интернете. Когда ваша служба работает в локальной сети, она будет работать через Интернет, как только вы разместите ее в IIS и перенаправите соответствующие порты на маршрутизаторы клиентов и серверов, это распространенный сценарий, который хорошо документирован в Интернете. Для этого вы должны разместить свою службу в качестве приложения на своем веб-сайте IIS. Вам необходимо убедиться, что в вашем сервисе есть файл .svc, который указывает на местоположение сервиса, а затем скопировать содержимое App.Config (файл конфигурации службы) для нового web.config (в том же физическом каталоге, что и ваш App.config), а также удалите<host><baseAddresses> В разделе вновь созданного файла web.config укажите физический путь приложения к местоположению этой службы на хост-компьютере службы. После этого просто отредактируйте привязки веб-сайтов по умолчанию, чтобы включить конкретные привязки, используемые вашей службой, дляnetTcpBinding перейти на: веб-сайт - & gt; "Изменить привязки ..." - & GT; & APOS; Add ... & APOS; затем выберите net.tcp и назначьте ему порты. Затем в вашем приложении перейдите в раздел «Расширенные настройки». и включите net.tcp,netTcpBinding сервис, как правило, будетhttp,net.tcp как это включено протоколы. Если вы сталкиваетесь с ошибками при прорезывании зубов, убедитесь, что пул приложений по умолчанию (или какой пул приложений, который используется на вашем веб-сайте) имеет необходимые разрешения для доступа и чтения физического каталога на сервере, на котором находится служба.

Пожалуйста, прочитайтеэтот а такжеэтотпросить меня уточнить, будет просто повторять то, что они говорят.

EDIT 21/06/2012:

Я только что скачал ваш сервис и разместил его в IIS, и он размещен нормально, поскольку он использует HTTP, а не nettcp, то это означает, что он отлично работает в Интернете. Если ваш сервис прост, и вы не собираетесь выполнять с ним тяжелую обработку (судя по всему, вы просто пытаетесь получить список клиентов, подключенных к нему), тогда придерживайтесьwsDualHTTPBinding поскольку протокол HTTP будет работать в любой среде, и вам не придется беспокоиться о брандмауэрах, как если бы выnetTcpBinding, Это все, что я сделал, чтобы разместить службу в IIS (и сделать ее доступной через Интернет):

Go to DefaultWebsite in IIS, right click, add application, under Alias just give your service any name you wish to be able to see in the URL. Select Default App Pool or ASP.NET 4.0 app pool.

Point the physical path to where your .svc file is on your computer; for me its:

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

Under enabled protocols ensure that you have HTTP on port 80 or any other port, for example 8085, but you will need to forward this port on your router to the Service host computer. If your Service host is on IP 192.168.1.4 in your LAN, then on your router forward port 80 (or whatever port you use-say 8085) to computer 192.168.1.4.

И это так просто.

посмотри мое обновление. Tanielian V. Barreira
Хорошее чтение действительно ... хорошо, я больше не знаю, собираюсь ли я на netTcp или wsDual, но не могли бы вы помочь мне заставить его работать? Я рад, что пример, реализованный по ссылке выше, работает ... Tanielian V. Barreira
@TanielianBarreira посмотри мое обновление.
@TanielianBarreira, я только что посмотрел статью, кажется, хорошо написано, в чем именно проблема? Судя по всему, он реализует простую службу чата, в WCF есть множество примеров обратных вызовов. Суть идеи заключается в том, что клиент вызывает некоторую операцию над службой, а служба, в свою очередь, может вызывать метод на клиенте (это обратный вызов), поэтому клиент временно будет похож на сам сервер. Методы вChatService это то, что клиенты вызывают на сервере, и методы вIChatServiceCallback это то, что сервис вызывает на клиентах.
Не могли бы вы попытаться ответить? В моем обновлении я просто спрашиваю, как я могу изменить свои настройки, чтобы иметь возможность подключаться через Интернет. То, как они сейчас (изменение URL-адреса сервера на клиенте), я просто получаю ошибки тайм-аута. Tanielian V. Barreira

Похожие вопросы