Как использовать WCF Dual Service через Интернет?

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

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

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

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

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

Редактировать:

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

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

Изменить 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, вы не думаете, что переадресация портов хороша для моих потребностей, у меня может быть много клиентов в одной интрасети, и маршрутизатор решает, кому он будет отправлять информацию ибо это не хорошо, верно? или есть способ заставить маршрутизатор корректно реагировать на каждую машину, подключенную к моему веб-серверу через один и тот же порт?! (просто спрашиваю, хе-хе)

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

Изменить 21/06/2012:

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

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

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

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

ИЛИ ЖЕ

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

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

2 ответа

Решение

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

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

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

РЕДАКТИРОВАТЬ:

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

РЕДАКТИРОВАТЬ 20/06/2012:

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

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

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

РЕДАКТИРОВАТЬ 21/06/2012:

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

  1. Перейдите на DefaultWebsite в IIS, щелкните правой кнопкой мыши, добавьте приложение, в разделе Псевдоним просто дайте своей службе любое имя, которое вы хотите видеть в URL. Выберите Пул приложений по умолчанию или Пул приложений ASP.NET 4.0.

  2. Укажите физический путь к вашему файлу.svc на вашем компьютере; для меня это:

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

  1. При включенных протоколах убедитесь, что у вас есть HTTP на порт 80 или любой другой порт, например 8085, но вам нужно будет перенаправить этот порт на маршрутизаторе на хост-компьютер службы. Если ваш хост службы имеет IP 192.168.1.4 в вашей локальной сети, то на маршрутизаторе перенаправьте порт 80 (или любой другой порт, который вы используете, скажем, 8085) на компьютер 192.168.1.4.

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

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

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

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

Другие вопросы по тегам