IIS8 没有监听 net.tcp 的终结点。

6

我是一名有用的助手,可以为您翻译以下内容:

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

我有以下配置:

Web.config:

<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,但当我尝试将其更改为运行IIS8的机器(ZZ.ZZ.ZZ.ZZ)的外部IP来访问服务时,出现以下错误:

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,并使用此配置在互联网上工作。

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!");

不知道为什么在互联网上运行相同的服务时IIS出了问题?本地可以工作。

谢谢
3个回答

8

但是如果我在“http,net.tcp”中有一个空格,即使是本地调用也不应该失败吧? - Sergio Figueiredo
1
我审核了IIS并且一切都没问题...问题是,如果我从与运行IIS8的机器相同的地方(本地主机)调用服务,一切正常,但当我从运行IIS的机器之外的地方调用相同的服务时,我会遇到错误。 - Sergio Figueiredo
听起来像是防火墙在阻止你。 - Middas
我使用ServiceHost创建了一个控制台应用程序,并在与IIS8相同的机器上运行它,使用自托管服务也可以正常工作...可能是地址的问题? - Sergio Figueiredo
2
我很高兴找到了你的答案。因为空格的缘故,我浪费了一整天的时间。 - kgw

8
如果你突然收到这个错误,那么它与其他进程劫持了net.tcp端口有关。在我的情况下,是808端口。以下是我大约花了3天时间找出问题的方法——是的,现在我只是通过谷歌和尝试解决别人的问题,而不是做自己的工作。

无论如何:



  1. Net.TCP依赖于2个Windows服务运行。转到服务并找到Net.Tcp Listener AdapterNet.Tcp Port Sharing Service如果您没有看到它们,则不适用此答案。这意味着您尚未在控制面板的打开或关闭Windows功能中激活该功能。您将在网上找到足够的信息以了解要启用什么。
  2. 停止Net.Tcp Port Sharing Service并在停止其他服务弹出窗口中单击
  3. 重新启动两个服务。
  4. 打开事件查看器> Windows日志>系统,并查看SMSvcHost 4.0.0.0(您的版本可能不同)是否有任何错误信息。我遇到了这个错误:An error occurred in the Activation Service 'NetTcpActivator' of the protocol 'net.tcp' while trying to listen for the site '1', thus the protocol is disabled for the site temporarily.是的,谢谢微软!你启动了一个服务,但实际上没有真正启动它,只是在事件查看器中添加了一条消息?太好了!因为在Windows服务启动期间告诉我太难了,对吧?无论如何,继续。
  5. 然后我需要找出是什么在使用端口(如上述错误)。因此,我运行了以下命令(您可能需要以管理员身份启动命令提示符。)
    • 运行netstat -ano | findstr "808"并注意最后一列中的数字。这些是使用该端口的进程ID。
    • 运行tasklist /fi "pid eq 9",其中9将是上述步骤中的进程ID。
  6. 现在您知道正在使用该端口的进程名称,您需要Google并找出该进程用于什么。在我的情况下,它与使用808端口的Intel图形驱动程序相关:OneApp.IGCC.WinService.exe
这是有道理的,因为其他一些进程已经在使用端口808,所以它对于Net.TCP来说不可用。

此时我有两个选择:

  1. 禁用该进程
  2. 尝试更改其端口

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


重启后再次运行以下命令,确保端口空闲可用:

  1. 运行 netstat -ano | findstr "808" 并注意最后一列中的数字。这些是使用该端口的进程 ID。
  2. 运行 tasklist /fi "pid eq 9",其中 9 是上面步骤中的进程 ID。现在您应该可以看到我们想要的 SMSvcHost.exe


谢谢Yoshi。我花了很多时间来找出问题所在,但是没有成功,你的答案解决了我的问题。 - Rizwan
我会请求问题的作者将此标记为答案,以便对其他人有所帮助。 - Rizwan

0

简单的答案是,在IIS下更改端口号 -> 编辑绑定 -> net.tcp 到其他数字。我把它改成了12345,这解决了我的问题。

这个问题与另一个进程使用默认端口808有关,如上述帖子所述。如果这没有帮助,请检查上面的答案并按照流程操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接