2012-06-18 64 views
5

我跟着这个教程(至少根据我的WCF在此,怎么我需要再上班一样): http://www.eggheadcafe.com/tutorials/wcf/b5ada8df-58c5-492f-b368-457b3a4f137c/notify-client-applications-using-wcf-callbacks.aspx如何通过互联网使用WCF双重服务?

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

我会有一个服务器,要知道在线客户端的数量。我想在服务器上的IIS上使用WFC服务,并且需要一个Windows服务使用它并通知它。我需要回调服务器有时必须能够在客户端执行一些命令。

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

由于提前,

编辑:

说明白了:我只是不能让它工作在互联网上。你们可以告诉我如何更改我的配置(Web.config和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> 

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

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

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

OR

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

只是改变了其CONFIGS足够多,使其通过互联网工作?就像我说的那样,本地它工作得很好。

我以为只是改变了客户端上的端点地址URL的一个它上面工作对子级,但它没有...

你的主机挂在WPF服务的例子。我不知道它是否适用于我的日记...

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

非常感谢提前,

编辑于21/06/2012:

感谢您的阅读。 我无法获得与LAN中的netTcpBinding一起使用的服务。 我做了一个模拟样本,我的纪念日。这是here。称为DualCommunicationTest。

当我开始这篇文章时,我只是想知道如何使这个cenarion在互联网上运行。只是。 在我发布这篇文章之前,我在寻找解决方案的时候,我认为netTcpBinding更好。所以我问了一下。这只是一个侧面的问题。

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

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

OR

如何使the sample i developed工作,NetTcpBinding的,然后可以使用它在互联网上。 (我很确定Clunky Coder教会了我第二部分,关于如何在IIS上发布net.tcp和其他内容,非常感谢,但是我还没有测试它,因为我不能测试它, t做一个netTcp呢。)

对不起,如果我不够清楚,我的英语不太好。谢谢,很多。

回答

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并通过互联网工作?

看来你都能够找到与LAN netTcpBinding工作的服务,所以你刚才的问题已经得到解决,现在您遇到托管在IIS服务的麻烦和在线出版它。当您的服务在局域网中运行时,一旦您将其托管在IIS中并在客户端和服务器路由器上转发适当的端口,它就可以在因特网上工作,这是一种常见的情况,并且在线记录良好。为此,您必须将您的服务作为应用程序托管在IIS网站中。您需要确保您的服务具有指向服务位置的.svc文件,然后将App.Config(服务配置文件)的内容复制到新的web.config(与您的服务相同的物理目录中App.config),并删除新创建的web.config中的<host><baseAddresses>部分,将应用程序的物理路径指向服务主机上该服务的位置。一旦完成,请务必编辑默认的网站绑定以启用您的服务使用的特定绑定,请netTcpBinding转至:网站 - >'编辑绑定...' - >'添加...',然后选择网络.tcp并为其分配端口。 然后在您的应用程序中转到'高级设置'并启用net.tcp,netTcpBinding服务通常会有http,net.tcp,因为它启用了协议。如果遇到初始化错误,请确保默认应用程序池(或您的网站正在使用的应用程序池)具有访问和读取服务所在服务器上的物理目录所需的权限。

请阅读thisthis,要求我详细说明只是重复他们的意思。

编辑21/06/2012:

我刚刚下载服务和托管它IIS和它因为它的使用HTTP,然后不nettcp这意味着它工作完全正常在互联网上托管的罚款。如果你的服务很简单,并且你不希望用它进行繁重的处理(通过它的外观,你只是想获得连接到它的客户端列表),然后坚持wsDualHTTPBinding,因为HTTP协议将工作在任何环境,你不必担心防火墙,因为你会用netTcpBinding。这就是我所做的东道国,在IIS服务(并使其可在互联网上):

  1. 围棋在IIS中DefaultWebsite,点击右键,添加应用程序,别名下只是给你的服务,你喜欢的任何名称能够在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。

就这么简单。

+0

不错的阅读确实...好吧,我不知道如果我去netTcp或wsDual,但是,你能帮我把它工作吗?我很高兴只是把上面的链接中实现的例子工作... –

+0

@TanielianBarreira,我只是看了文章,似乎写得很好,问题到底是什么?它通过它的外观实现了一个简单的聊天服务,在WCF中有很多关于回调的例子。这个想法的要点是客户端调用服务的某些操作,而服务又可以调用客户端的一个方法(这是回调),所以客户端将暂时像服务器本身一样。 ChatService中的方法是客户端在服务器上调用的,IChatServiceCallback中的方法是服务在客户端上调用的方法。 –

+0

@TanielianBarreira看看我的更新。 –

1

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

互联网并非真正为服务器通过HTTP回叫建立。诸如路由器执行的NAT等事情意味着必须转发端口以正确路由HTTP请求,并且客户端必须运行HTTP服务器。

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

+0

感谢您的回复,但我如何更改上面的示例使用netTcp? –