如何在虚拟机中使用托管在 Windows 服务中的 WCF
Posted
技术标签:
【中文标题】如何在虚拟机中使用托管在 Windows 服务中的 WCF【英文标题】:How to use WCF hosted in windows service in VM 【发布时间】:2017-07-26 13:34:47 【问题描述】:我对 WCF 及其配置没有足够的经验,也不知道如何解决这个问题。所以我很抱歉这个可能很愚蠢的问题。
我有托管 WCF 的带有 Windows 服务的虚拟机。我想从运行此虚拟机的本地计算机上运行的客户端与此 WCF 通信。我可以毫无问题地在本地运行该服务,但是在与虚拟机上的服务通信时,我很难正确配置它。我想使用 TCP 连接而不使用 IIS。
我尝试指定 VM 的地址、备用地址和端点,但没有成功。你能告诉我什么是正确的配置吗?
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="NetTcpBindingConfiguration">
<security mode="None" />
</binding>
</netTcpBinding>
</bindings>
<services>
<service behaviorConfiguration="WCFHostBehaviour" name="TestRunnerWCF.Service">
<endpoint address="" binding="netTcpBinding" bindingConfiguration="NetTcpBindingConfiguration"
name="WCFHostNetTcpEndpoint" contract="TestRunnerWCF.IService" />
<endpoint address="mex" binding="mexTcpBinding" bindingConfiguration=""
name="WCFHostMexTcpEndpoint" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="net.tcp://192.168.10.25/Service" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="WCFHostBehaviour">
<serviceMetadata httpGetEnabled="false" httpsGetEnabled="false" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
更新 1: 我不知道如何在我的客户端中添加服务参考。如果我使用 localhost 我在本地机器上运行服务,这是不需要的。
虚拟机在 Hyper-V 中运行,地址为 192.168.10.25。我可以从本地机器 ping 它。我不使用任何端口转发。
我可以使用这个配置在虚拟机上运行客户端:
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="WCFHostNetTcpEndpoint">
<security mode="None" />
</binding>
</netTcpBinding>
</bindings>
<client>
<endpoint address="net.tcp://192.168.10.25/Service" binding="netTcpBinding"
bindingConfiguration="WCFHostNetTcpEndpoint" contract="ServiceReference1.IService"
name="WCFHostNetTcpEndpoint">
</endpoint>
</client>
</system.serviceModel>
但是当我尝试在本地机器上运行客户端时,我无法连接到我的虚拟机。
Error: Cannot obtain Metadata from net.tcp://192.168.10.25/Service If this
is a Windows (R) Communication Foundation service to which you have access,
please check that you have enabled metadata publishing at the specified
address. For help enabling metadata publishing, please refer to the MSDN
documentation at http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata
Exchange Error URI: net.tcp://192.168.10.25/Service Metadata contains
a reference that cannot be resolved: 'net.tcp://192.168.10.25/Service'.
Could not connect to net.tcp://192.168.10.25/Service. The connection attempt
lasted for a time span of 00:00:21.0324561. TCP error code 10060: A
connection attempt failed because the connected party did not properly
respond after a period of time, or established connection failed because
connected host has failed to respond 192.168.10.25:808. A connection
attempt failed because the connected party did not properly respond after a
period of time, or established connection failed because connected host has
failed to respond 192.168.10.25:808
【问题讨论】:
你能详细说明你面临什么样的问题吗?这是您的主机配置,您如何使用您的服务?也许问题出在客户端。 我无法在客户端中添加对 VM 服务的服务引用。我可以使用 localhost 作为地址,但是服务只在本地机器上运行。 所以你需要指定VM的IP地址。但首先你需要确保你可以访问它。尝试与telnet <Your_VM_IP> <WCF_Service_Port>
连接。如果无法连接,首先可以在虚拟机的防火墙中添加入站规则(新规则-> 选择端口-> 下一步-> 输入 wcf 服务端口-> 完成)。很可能防火墙阻止了您的 VM wcf 端口上的连接。
@benderto 您正在使用什么虚拟机?什么类型的网络?你做了端口转发吗?
好的,我的防火墙规则不正确。谢谢你的建议。
【参考方案1】:
正如 Reniuz 指出的那样,VM 中的防火墙阻止了我的连接。 原评论:
所以你需要指定VM的IP地址。但首先你需要确保你可以访问它。尝试使用 telnet 连接。如果无法连接,首先可以在虚拟机的防火墙中添加入站规则(新规则-> 选择端口-> 下一步-> 输入 wcf 服务端口-> 完成)。很可能防火墙阻止了您的 VM wcf 端口上的连接。 ——雷诺兹
【讨论】:
以上是关于如何在虚拟机中使用托管在 Windows 服务中的 WCF的主要内容,如果未能解决你的问题,请参考以下文章
windows宿主机访问ubuntu虚拟机中的docker服务