为什么我无法从机器外部访问我的WCF服务,但本地可以?

4
我有一个在配置了IIS的机器上运行的WCF自托管服务。自托管服务可以顺利启动,并且一旦它启动,我实际上可以访问?wsdl路径。
如果我尝试在该机器上访问以下地址,它会加载有关svcutil.exe的网页,并介绍如何访问该服务。
http://myspecialservice:9000/
http://192.168.1.230:9000/

然而,如果我尝试从另一台机器访问相同的地址,什么也没有发生。没有错误,页面无法加载。我已经测试过使用主机名时是否解析到正确的IP地址。
此外,我已配置服务的.exe在Windows防火墙高级安全性中允许。对于所有以太网配置文件和任何端口。任何建议都将有很大帮助。再次说明,我知道该服务在本地机器上是可访问的,并且它正常工作。似乎我在某个地方缺少了机器配置。
<?xml version="1.0"?>
<configuration>
  <system.diagnostics>
    <trace autoflush="true">
      <listeners>
        <add name="TextWriter" type="System.Diagnostics.TextWriterTraceListener" initializeData="trace.log"/>
        <add name="Console" type="System.Diagnostics.ConsoleTraceListener"/>
        <remove name="Default"/>
      </listeners>
    </trace>
  </system.diagnostics>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="CustomHttpBinding" maxReceivedMessageSize="2147483647">
          <readerQuotas maxStringContentLength="2147483647"/>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client/>
    <services>
      <service name="MyService.Data.Service" behaviorConfiguration="serviceBehavior">
        <clear/>
        <endpoint address="JobsHttp" binding="basicHttpBinding" contract="MyService.Data.IWhereItSits" bindingConfiguration="CustomHttpBinding"></endpoint>
        <endpoint binding="mexHttpBinding" name="httpmex" contract="IMetadataExchange"></endpoint>
        <host>
          <baseAddresses>
            <add baseAddress="http://myspecialservice:9000/"/>
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="serviceBehavior">
          <serviceMetadata httpGetEnabled="true"/>
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>

编辑 1

在防火墙上打开9000端口而不是指定服务.exe的规则使我能够在本地网络上访问该服务。现在我正在尝试从外部世界访问该服务。我已经在路由器上添加了一条规则,将来自9000端口的任何流量推送到服务器本身,但我没有得到任何东西。

编辑 2

我已经在Web服务器上安装了网络监视器,并确认路由器将流量传回服务器本身。然后服务器尝试发送响应。

编辑 3

对我来说毫无意义。该服务器有两个网卡,我从路由器对服务器进行了目标1 IP的定位。我将其更改为另一个IP,从外部就可以正常工作。有什么解释或答案吗?


1
你正在使用IIS,而不是IIS-Express吗?(后者默认情况下不允许远程连接) - Kirk Woll
1
你的WCF服务的IIS绑定是“所有未分配”还是一个IP地址(不应该是127.0.0.1)? - chue x
2
你是如何从“外部世界”进行测试的呢?是在3G手机上还是朋友的互联网连接上或其他什么地方?我问这个问题是因为有时候,根据网络的不同,您可能无法通过其外部IP访问本地网络上托管的服务。如果您确实在外部,但仍无法加载,那么您是如何确定外部IP的呢?设置端口转发和打开防火墙应该就足够了。所以可能是您没有将其指向正确的IP地址? - mikey
@Phill,你有什么替代方案推荐吗? - DeanOC
这就是我所想的,但它是一个非常基本的路由器。我在该路由器上设置了端口转发,使端口80的流量命中同一台服务器,也许这就是问题所在?即使我已经指定端口9000也要发送到同一台服务器? - Steven Combs
显示剩余8条评论
1个回答

0
在你的编辑中,你说你能够访问到你的服务器,但是192.168.1.230是一个本地地址,它只在你的本地网络内有效。你在外部世界的IP地址是不同的。 :/

编辑

您的IIS监听了什么?也许您的绑定(IIS->您的站点->右键单击->编辑绑定)仅设置为其他IP。如果是这样,将IP地址更改为“所有未分配”的话,应该可以使您的服务响应第一个IP。


这就是为什么在其他编辑中提到使用路由器的原因。 - Steven Combs
让我检查一下,刚刚看到这个编辑,我没有收到任何通知。 - Steven Combs

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