【问题标题】:Self Hosted WebApi Accessible over LAN可通过 LAN 访问的自托管 WebApi
【发布时间】:2013-05-27 20:57:04
【问题描述】:

Self Host WebApi 非常新,但它的易用性和可扩展性给我留下了深刻的印象。至少通过这个tutorial。到目前为止,我所做的一切都适用于我的开发机器,无论我使用的是 localhost、127.0.0.1 还是我的 LAN Ip (192.168.0.x),但我很困惑为什么我无法从任何其他计算机甚至其他计算机访问该服务在同一个子网中。

简而言之,在运行它的机器上完成教程后: 浏览到

localhost:3636/api/products/ 

导致预期的 xml 返回。 在 LAN 上的另一台机器上浏览到:

192.168.0.x:3636/api/products/ 

导致超时 对于那些可能知道这一切如何相互作用的人的数据点:

1.) 我的开发机器(192.168.0.x,服务器,主机无论你想怎么称呼它)上面都有 IIS;我太偏执了,以至于我通过管理 GUI 阻止了它

2.) 我已通过以下命令行执行保留 URL/端口:

    >netsh http add urlacl url=http://+:3636/ user=DOMAIN\USER listen=yes delegate=yes
    >netsh http add urlacl url=http://192.168.0.x:3636/ user=DOMAIN\USER listen=yes delegate=yes

2.b)我已经同时尝试了这两种方法,并尝试将用户更改为“每个人”都无济于事

3.) 我已尝试更改教程中的代码以设置

    config.HostNameComparisonMode = HostNameComparisonMode.Exact //default is Strong Wildcard 

4.) 我可以从 LAN 上的其他机器成功 ping 和跟踪到 192.168.0.x

5.) 一位朋友建议我设置一个 TCPListener 并确保我可以远程登录到它以消除防火墙的可能性。如果这个逻辑是合理的,那么防火墙就不是问题

编辑:感谢您的帮助,这是另一个数据点,我相信它可以确认这不是防火墙问题。我之前在一个相当迟钝的(至少对于像我这样的非认证人员)瞻博网络防火墙/路由器后面发布了这个连接。我已经在我的家庭网络上的另一台机器(没有 IIS)上重做了教程,但仍然无法将服务发布到我局域网中的其他计算机。有什么想法吗?

【问题讨论】:

  • 您是否在 DOMAIN\USER 下运行服务?我通常发现将服务作为 NETWORK SERVICE 运行更容易,然后在 netsh 命令中输入 user="NT AUTHORITY\NETWORK SERVICE"
  • 另外,我会仔细检查您的防火墙并确保 netstat -a 显示您的服务正在侦听。
  • 感谢达雷尔的想法。我目前仍在我的用户下调试服务(如果这很重要,谁拥有管理员权限)。我运行 netstat -a (在我的开发/主机上,如果这就是你的意思的话)并看到以下条目(除其他外): Proto Local Address Foreign Address State TCP 0.0.0.0:3636 DOMAIN:0 LISTENING TCP [::]: 3636 域:0 监听 不太清楚该怎么做。我想我会尝试确认防火墙。

标签: asp.net-web-api self-hosting


【解决方案1】:

我会尝试几件事:

首先,去掉 HostNameComparisonMode 行。这实际上可能会禁用来自其他机器的请求。

如果仍然无法正常工作,请尝试摆脱 URL ACL 并以管理员身份运行您的应用程序,看看是否可行。如果可行,您可以重新添加 URL ACL,而不必以管理员身份运行。您应该只需要以“+”作为主机名的那个。

【讨论】:

  • 根据我的经验,如果 IIS 在同一台机器上运行,那么您需要 HostNameComparisonMode.Exact 否则 IIS 会窃取请求。嗯,等等,可能不在 80 以外的端口上。
  • 很抱歉,每次我尝试更改 HostNameComparisonMode 时都忘记提及我在 server.OpenAsync().Wait();线。确切的异常嵌套(多层内部)为:System.AggregateException/System.ServiceModel.CommunicationException/.Net.HttpListenerException:“指定网络名称的格式无效”。这就是为什么我认为这行不通
  • 我让它编译并运行,将我的配置构造参数从 196.168.0.x 更改为 localhost;但是随后该服务无法在本地计算机上运行,​​因此退出了。
  • 将配置更改为 localhost 并且不要设置 HostNameComparisonMode。这应该适用于本地机器和远程机器。
  • 感谢 Youssef 抽出宝贵时间,但我看不出行为有任何变化。我已经重新启动,并且在我启动我的 selfhost 之前 ACL 已经消失,并且显然是自己获取了 ACL;但是没有其他变化。
【解决方案2】:

这不是硬件防火墙,是 Windows 防火墙!哎呀,我浪费了很多时间。一旦我关闭了 Windows 防火墙(代码无论如何都在 Intranet 中运行),一切正常。

任何人都知道解释防火墙和wireshark如何交互的好网站;或者我想这只是一个人的第一次测试。

【讨论】:

  • 这不是答案
【解决方案3】:

当我尝试使用 OWIN 进行自我托管时,我遇到了同样的问题。对我有用的是-

  1. 以管理员身份运行 Visual Studio
  2. 删除我在调试此问题时添加的所有 netsh urlacl 端口注册
  3. 向我的 Windows 防火墙添加入站规则 我按照此链接上的说明进行操作 https://docs.microsoft.com/en-us/dotnet/framework/wcf/samples/firewall-instructions 查看部分 - 提前启用端口范围

就是这样!我能够从网络上的其他计算机调用我的 api。

希望这会有所帮助...

【讨论】:

    猜你喜欢
    • 2014-08-18
    • 2018-07-11
    • 1970-01-01
    • 2013-06-20
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    相关资源
    最近更新 更多