如何通过互联网使用WCF双服务?

时间:2012-06-18 12:42:24

标签: wcf callback nettcpbinding wsdualhttpbinding

我遵循了本教程(至少基于我的WCF,因为我需要同样的工作): http://www.eggheadcafe.com/tutorials/wcf/b5ada8df-58c5-492f-b368-457b3a4f137c/notify-client-applications-using-wcf-callbacks.aspx

它在我的电脑上工作得很好,但我需要通过互联网使用它。在尝试这样做时,我听说(通过互联网)最好使用netTcpBiding。

我将拥有一台能够了解在线客户数量的服务器。我想在服务器上的IIS上使用WFC服务,并使用Windows服务并通知它。我需要回调因为服务器有时必须能够在客户端上执行一些命令。

如果有人能帮助我,我会很高兴。

提前致谢,

编辑:

让自己清楚:我无法让它在互联网上运作。你们能告诉我如何更改我的配置(Web.config e App.config)以使用netTcpBinding并通过互联网工作?

再次感谢,

编辑2:

我的WCFServiceApplication中的Web.config是:

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

我的WindowsService中的我的App.config是:

<?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不起作用......

但我很高兴能够通过互联网运行这个...我在IIS上发布了WCFService。链接:

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

OR

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

只是改变它应该通过互联网工作的配置?就像我说的那样,本地工作得很好。

我认为只是将客户端上的端点地址更改为上面的URL之一就可以了,但它没有......

您链接的示例在WPF上托管服务。我不知道它是否适用于我的居所......

我想我会坚持使用DualHttpBinding,你不认为端口转发它对我的需求有好处,我可以在一个内部网中拥有很多客户端并让路由器决定他要去哪一个发送信息对它不好吗?或者有一种方法可以让路由器通过相同的端口对每台连接到我的网络服务器的机器做出相应的响应?! (只是问,呵呵呵)

提前多多感谢,

编辑于21/06/2012:

感谢阅读。 我无法使该服务与LAN中的netTcpBinding一起使用。 我做了我的cenario的模拟样本。这是here。称为DualCommunicationTest。

当我开始这篇文章时,我只是想知道如何让这个cenarion在互联网上运行。只是。 在我发布此处之前搜索解决方案期间,我认为netTcpBinding更好。所以我问了一下。这只是一个附带问题。

所以......我目前对帖子的需求是:

如何在互联网上使用the sample i developed

OR

如何使the sample i developed与netTcpBinding配合使用,然后才能在互联网上使用它。 (我非常肯定Clunky Coder教我第二部分,关于如何使用IIS和东西在互联网上发布net.tcp,非常感谢,但我还没能测试它,因为我还不能做netTcp。)

我很抱歉,如果我不够清楚,我的英语不太好。 sry,再次感谢,很多。

2 个答案:

答案 0 :(得分:5)

netTcpBinding更适合双工通信(与回调通信),并且它比WSDualHttpBinding更高效,后者是HTTP上双工通信的首选绑定。但是你不应该在互联网上真正使用netTcpBinding,尽管技术上可以并且它可能有用,但netTcpBinding使用的端口可能(并且通常是)被阻止互联网上的防火墙。当您通过互联网发送内容时,它会产生大量跳跃并经过大量路由器和防火墙,并且无法保证这些路由器和防火墙将打开所有端口。但是,如果您可以在客户端和服务器端点上打开端口(对于netTcp,它是TCP 808)(通常通过路由器上的端口转发完成),它可能会起作用,但一般的建议是不要使用netTcpBinding而不是互联网。话虽如此,我已经使用了几次我的服务,而且我的客户端能够在没有任何问题的情况下通过互联网使用服务 - 在我转发客户端和服务器端的端口之后。

通常,对于通过互联网进行双工通信,您拥有WSDualHttpBinding,如果您拥有Silverlight客户端(Silverlight不支持WSDualHttpBinding),则可以使用PollingDuplexHttpBinding

我还建议您阅读this

修改

要更改该示例以使用netTcpBinding,只需更改配置文件中的绑定即可使用netTcpBinding而不是wsDualHttpBinding。看一下this article,它会根据您发布的链接执行netTcpBinding以及更多解释。

编辑20/06/2012:

  

让自己清楚:我无法让它在互联网上运作。   你们能告诉我如何更改我的配置(Web.config e   App.config)使用netTcpBinding并通过互联网工作?

似乎您可以让该服务与局域网中的netTcpBinding一起使用,因此您之前的问题现已解决,您现在无法在IIS中托管服务并在线发布。当您的服务在局域网中工作时,一旦您在IIS中托管它并在客户端和服务器路由器上转发相应的端口,它将在Internet上工作,这是一种常见的情况,并且在线记录良好。为此,您必须将服务作为IIS网站中的应用程序托管。您需要确保您的服务具有指向服务位置的.svc文件,然后复制其中的内容 将App.Config(服务配置文件)添加到新的web.config(与App.config位于同一物理目录中)并删除新创建的web.config中的<host><baseAddresses>部分,指向物理路径应用程序在服务主机上的此服务的位置。一旦处理完毕,只需确保编辑默认网站绑定以启用您的服务使用的特定绑定,netTcpBinding转到:网站 - &gt; '编辑绑定...' - &gt; '添加...'然后选择net.tcp并为其分配端口。 然后在您的应用程序上转到“高级设置”并启用net.tcp,netTcpBinding服务通常会有http,net.tcp作为启用的协议。如果您遇到错误,请确保默认应用程序池(或您的网站正在使用的应用程序池)具有访问和读取服务所在服务器上的物理目录所需的权限。

请阅读thisthis,请我详细说明是否会重复他们所说的内容。

编辑21/06/2012:

我刚下载了您的服务并将其托管在IIS中并且托管正常,因为它使用HTTP而不是nettcp,这意味着它在互联网上运行得非常好。如果您的服务很简单,并且您不希望使用它进行繁重的处理(通过它的外观,您只是尝试获取连接到它的客户端列表),那么从HTTP开始就坚持使用wsDualHTTPBinding协议可以在任何环境中工作,您不必像netTcpBinding那样担心防火墙。这就是我在IIS中托管服务所做的全部工作(并通过互联网提供):

  1. 转到IIS中的DefaultWebsite,右键单击,添加应用程序,在Alias下,只需为您的服务提供您希望在URL中看到的任何名称。选择“默认应用程序池”或“ASP.NET 4.0应用程序池”。

  2. 将物理路径指向.svc文件在计算机上的位置;对我而言:

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

    1. 在启用的协议下,确保您在端口80或任何其他端口上具有HTTP,例如8085,但您需要将路由器上的此端口转发到服务主机。如果您的服务主机位于您的LAN中的IP 192.168.1.4上,那么您的路由器正向端口80(或您使用的任何端口 - 例如8085)到计算机192.168.1.4。
    2. 就这么简单。

答案 1 :(得分:1)

TCP绑定对于互联网上的回调更好,因为TCP本质上是双向的。 HTTP是一个请求,它只是一种方式。因此在dualHttpBinding中是双重的。 WCF必须创建第二个HTTP连接回客户端,以便服务可以向客户端发送请求。

互联网并未真正设置为通过HTTP回叫的服务器。像路由器执行NAT这样的事情意味着必须转发端口才能正确路由HTTP请求,客户端必须运行HTTP服务器。

因此,使用TCP要容易得多。客户端请求或者可能让客户端请求从服务器端流式传输的回复对象(实际上是永无止境的回复),服务器可以向下发送通知。但这并不简单。