5

我在 IIS8 中有一个 WCF 服务主机,我想使用 net.tcp 绑定。

我有这个配置:

网络配置:

<service behaviorConfiguration="MyBehavior"
  name="DecryptService.EmailCenterDecryptTCP">
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://XX.XX.XX.XX:808/VirtualFolder/Service.svc" />
      </baseAddresses>
    </host>

    <endpoint address=""
          binding="netTcpBinding"
          bindingConfiguration="portSharingBinding"
          name="MyServiceEndpoint"
          contract="ServiceNamespace.IService">
    </endpoint>

    <endpoint address="mextcp"
          binding="mexHttpBinding"
          bindingConfiguration=""
          name="MyServiceMexTcpBidingEndpoint"
          contract="IMetadataExchange" />
</service>

当我尝试在与 IIS8 相同的机器上使用该服务时,以下配置工作正常:

<client>
        <endpoint address="net.tcp://YY.YY.YY.YY:808/VirtualFolder/Service.svc"
            binding="netTcpBinding" bindingConfiguration="MyServiceEndpoint"
            contract="ServiceReference1.IService" name="MyServiceEndpoint" />
    </client>

YY.YY.YY.YY 是机器的本地 IP,但是当我尝试在另一台机器上使用服务时,将 YY.YY.YY.YY 更改为运行 IIS8 的机器的外部 IP (ZZ.ZZ.ZZ.ZZ)我收到以下错误:

There was no endpoint listening at net.tcp://ZZ.ZZ.ZZ.ZZ/VirtualFolder/Service.svc that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details.

有任何想法吗?感谢和抱歉我的英语不好

编辑:

我制作了一个运行 ServiceHost 替换 IIS 的控制台应用程序,并且使用此配置它可以在 Internet 上运行

var svh = new ServiceHost(typeof (Service));
svh.AddServiceEndpoint(typeof (ServiceNamespace.IService), new NetTcpBinding(SecurityMode.None), "net.tcp://serverLocalIp:808");
svh.Open();

Console.WriteLine("SERVER - Running...");
stopFlag.WaitOne();

Console.WriteLine("SERVER - Shutting down...");
svh.Close();

Console.WriteLine("SERVER - Shut down!");

知道通过 Internet 运行相同服务的 IIS 有什么问题吗?本地工作。谢谢

4

3 回答 3

8

您还需要设置 IIS 以接收 Net.TCP 连接。

Advanced Settings你的 IIS 应用程序下,然后Enabled Protocols确保你http,net.tcp注意到没有空间,如果你有空间它会失败。

http://blogs.msdn.com/b/swiss_dpe_team/archive/2008/02/08/iis-7-support-for-non-http-protocols.aspx

于 2013-04-05T16:40:03.240 回答
7

如果您有一天突然收到此错误,则它与劫持 net.tcp 端口的另一个进程有关。就我而言,它是端口 808。这是我在大约 3 天后发现的方法——是的,这就是我现在所做的,谷歌并试图找出其他人的错误,而不是自己做。

无论如何:


  1. Net.TCP 依赖于 2 个正在运行的 Windows 服务。转到 services 并找到Net.Tcp Listener AdapterNet.Tcp Port Sharing Service如果您没有看到它们,则此答案不适用于您。这意味着您还没有激活控制面板中的功能 打开或关闭 Windows 功能。您将找到有关在线启用内容的大量信息。
  2. 停止Net.Tcp 端口共享服务并在停止其他服务弹出窗口中单击是。
  3. 重新启动这两个服务。
  4. 打开事件查看器 > Windows 日志 > 系统并查看是否在列中看到SMSvcHost 4.0.0.0的任何错误(您的版本可能不同) 。我遇到了这个错误:尝试侦听站点“1”时,协议“net.tcp”的激活服务“NetTcpActivator”发生错误,因此该站点暂时禁用了该协议。是的,谢谢女士!您启动了一项服务,但并未真正启动它,只是向事件查看器添加了一条消息?伟大的!因为在 Windows 服务启动期间告诉我太难了,对吗?好吧,无论如何,让我们继续。
  5. 然后我需要根据上面 4 中的错误弄清楚是什么在使用端口。所以我运行了以下命令(您可能需要在管理员模式下启动命令提示符。)
    • 运行netstat -ano | findstr "808"并记下列中的数字。这些是使用端口的进程 ID。
    • 运行任务列表 | 9,其中 9 将是来自上述步骤的进程 ID。
  6. 现在您知道使用端口的进程名称,您需要谷歌并找出该进程的用途。在我的情况下,它与使用端口 808 的 Intel 图形驱动程序有关: OneApp.IGCC.WinService.exe

这是有道理的,因为其他一些进程已经在使用端口 808,因此它不适用于Net.TCP


此时我有两个选择:

  1. 禁用该进程
  2. 也许看看我是否可以更改它的端口。

幸运的是,他们已经对驱动程序进行了更新,所以我只是从这里下载并安装了它。


重新启动,然后再次运行以下命令以确保端口对 net.tcp 可用:

  1. 运行netstat -ano | findstr "808"并记下列中的数字。这些是使用端口的进程 ID。
  2. 运行任务列表 | 9,其中 9 将是来自上述步骤的进程 ID。现在您应该看到我们想要的SMSvcHost.exe 。

于 2020-11-11T22:25:11.570 回答
0

简单的答案,将 IIS -> 编辑绑定 -> net.tcp 下的端口号更改为其他内容。我将其更改为 12345,这解决了我的问题。

这是与使用默认端口 808 的另一个进程相关的问题,如上文所述。如果这没有帮助,请检查上面的答案和休闲程序。

于 2020-11-29T12:23:23.013 回答