gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:47:56 24 4
gpt4 key购买 nike

我遵循了本教程(至少基于我的 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 并通过 Internet 工作吗?

再次感谢,

编辑 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

或者

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

只需更改配置即可使其通过互联网工作?就像我说的,本地它工作得很好。

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

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

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

非常感谢提前,

21/06/2012 编辑:

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

当我开始这篇文章时,我只是想知道如何让这个塞纳里奥在互联网上运行。只是。
在我在这里发帖之前寻找解决方案的过程中,我读到 netTcpBinding 更好。所以我问了一下。这只是一个附带问题。

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

使用方法 the sample i developed在网上。

或者

如何制作 the sample i developed使用 netTcpBinding 然后就可以在互联网上使用它。 (我很确定 Clunky Coder 教了我第二部分,关于如何使用 IIS 和其他东西在互联网上发布 net.tcp,非常感谢,但我还不能测试它,因为我还不能做 netTcp。)

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

最佳答案

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

一般来说,对于通过 Internet 进行的双工通信,您有 WSDualHttpBinding如果您有 Silverlight 客户端(Silverlight 不支持 WSDualHttpBinding),您可以使用 PollingDuplexHttpBinding .

我还建议您阅读 this .

编辑:

将该示例更改为使用 netTcpBinding , 只需将配置文件中的绑定(bind)更改为使用 netTcpBinding而不是 wsDualHttpBinding .看看this article ,它执行您发布的链接的功能,使用 netTcpBinding和更多的解释。

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

请阅读 thisthis ,让我详细说明只会重复他们在说什么。

编辑 21/06/2012:

我刚刚下载了您的服务并将其托管在 IIS 中,并且托管得很好,因为它使用 HTTP 而不是 nettcp 那么这意味着它在互联网上运行良好。如果您的服务很简单,并且您不希望对其进行繁重的处理(从外观上看,您只是想获取与其连接的客户端列表),那么请坚持使用 wsDualHTTPBinding因为 HTTP 协议(protocol)适用于任何环境,您不必像使用 netTcpBinding 那样担心防火墙问题。 .这就是我在 IIS 中托管服务(并使其可通过 Internet 使用)所做的全部工作:
  • 转到 IIS 中的 DefaultWebsite,右键单击,添加应用程序,在别名下只需为您的服务提供您希望能够在 URL 中看到的任何名称。选择默认应用程序池或 ASP.NET 4.0 应用程序池。
  • 将物理路径指向 .svc 文件在计算机上的位置;对我来说:
  • C:\Users\MyPC\Documents\DualCommunicationTest.Server\WcfServiceApp
  • 在启用的协议(protocol)下,确保您在端口 80 或任何其他端口(例如 8085)上有 HTTP,但您需要将路由器上的此端口转发到服务主机计算机。如果您的服务主机在 LAN 中的 IP 192.168.1.4 上,则在您的路由器上将端口 80(或您使用的任何端口,例如 8085)转发到计算机 192.168.1.4。

  • 就这么简单。

    关于wcf - 如何通过互联网使用 WCF 双服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11083143/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com