WCF net.tcp - 目标机器拒绝连接
Posted
技术标签:
【中文标题】WCF net.tcp - 目标机器拒绝连接【英文标题】:WCF net.tcp - Connection refused by target machine 【发布时间】:2016-04-02 10:33:58 【问题描述】:我在 Windows 8 x 64 和 Windows 7 x 64 操作系统上遇到了这个问题。我有一个使用 net.tcp 绑定的简单 WCF 服务。
我已经关注了很多文章来编写这个简单的服务,包括 MSDN 上的以下内容:Hosting and Consuming WCF services
我的服务和配置文件和上面的文章完全一样。
使用 InstallUtil.exe 作为 Windows 安装此 WCF 服务后 服务,我可以看到服务安装正确并且它 运行没有任何错误。我试图在 OnStart 和 Windows 服务的 OnStop 方法,并没有发现任何问题。 一旦我尝试从另一个解决方案中引用此端点,我 出现以下错误。
无法连接到 net.tcp://localhost:8523/Inbound。连接 尝试持续了 00:00:00.9531494 的时间跨度。 TCP错误代码 10061:无法建立连接,因为目标机器 127.0.0.1:8523 主动拒绝。
我已经在互联网上尝试了大多数与此问题相关的帖子,还尝试过打开防火墙、卸载防病毒软件、尝试不同的端口、在防火墙中为这些端口明确创建入站和出站规则等。仍然我无法访问托管我基于 net.tcp 的 WCF 服务的 Windows 服务。我的 TCP 端口共享服务和 TCP 侦听器适配器服务已打开,并且我已打开运行这些 TCP 服务所需的必要 Windows 功能。
我可以看到,我总是可以在另一个项目的同一个解决方案中访问这个服务,因为当我尝试引用这个服务时,Visual Studio 会立即创建一个 Wcf 服务主机 (WcfSvcHost),它会找到所有端点当前解决方案中的项目并加载它们。只要此主机正在运行,我也可以在另一个解决方案中引用此服务而不会出现问题。
托管我的服务的 Windows 服务也与给定的代码相同。显然,这会创建 ServiceHost 的实例并运行它。我已经用一些日志验证了这一点,它在服务启动时成功执行。但是当我的服务启动时,我无法在任务管理器中看到此进程正在运行。当我在同一个解决方案中调试或尝试在上述同一个解决方案中引用时,我可以在 Visual Studio 运行它时看到此服务。
现在我的问题是,我应该在我的服务启动时在任务管理器中看到这个 WcfSvceHost 服务吗?我相信我应该。请纠正我,如果我 我错了。
我是否需要向我的 Windows 服务授予任何特殊权限才能运行此 ServiceHost,还是问题完全不同?我在这里忽略了一些非常明显的东西吗?任何帮助将不胜感激。谢谢。
这是我的配置文件。
<system.serviceModel>
<bindings />
<client />
<services>
<service name="MyWcfServiceLibrary.WCFService">
<endpoint address="" binding="netTcpBinding" bindingConfiguration="" name="TCPEndPoint" contract="MyWcfServiceLibrary.IWCFService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexTcpBinding" bindingConfiguration="" name="mexEndPoint" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="net.tcp://127.0.0.1:8523/MyWCFService" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="false" httpsGetEnabled="false" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
【问题讨论】:
这里的问题是一个愚蠢的错误。我很抱歉。我无法发布我的服务类代码,因为堆栈溢出不允许我。在 myServiceHost = new ServiceHost(typeof(MyWCFService)) 中,我错误地引用了 windows 服务类而不是 WCF 服务。这就是它没有创建 WCF 服务主机的原因。阿里亚,我感谢你的帮助。谢谢。 【参考方案1】:让我们通过排除来调试。 你启用端口共享了吗? 这是为了在多个进程之间共享 TCP 端口。根据 Microsoft 的说法,“此服务是作为 WCF 的一部分安装的,但作为安全预防措施,该服务默认未启用”。
这里是如何使用 MMC 启用 Net.TCP 端口共享服务
-
从“开始”菜单中,通过打开命令提示符窗口并键入 services.msc 或打开“运行”并在“打开”框中键入 services.msc 来打开服务管理控制台。
在服务列表的名称列中,右键单击 Net.Tcp 端口共享服务,然后从菜单中选择属性。
要启用服务的手动启动,请在“属性”窗口中选择“常规”选项卡,在“启动类型”框中选择“手动”,然后单击“应用”。
要启动服务,请在“服务状态”区域中单击“启动”按钮。服务状态现在应显示“已启动”。
要返回服务列表,请单击确定,然后退出 MMC 控制台。
您也可以像这样在配置中启用 NetTcpBinding。
<system.serviceModel>
<bindings>
<netTcpBinding name="portSharingBinding"
portSharingEnabled="true" />
</bindings>
<services>
<service name="MyService">
<endpoint address="net.tcp://localhost/MyService"
binding="netTcpBinding"
contract="IMyService"
bindingConfiguration="portSharingBinding" />
</service>
</services>
</system.serviceModel>
如果启用了端口共享服务并且您手动启动了它,请检查是否有另一个应用程序在端口 8523 上运行。您可以在命令提示符下使用 Netstat -a 或从以下地址使用 TCPView。 TCPView
【讨论】:
我的 net.tcp 端口共享服务已经在运行。我还尝试将 portSharingEnabled 属性添加到配置文件中。之后我得到 AddressAlreadyInUseException。我已尝试使用 TCPView 和 netstat 命令来查找所有活动端口,但我使用的端口 (8523) 未在此处列出。只有当我尝试调试此服务时,我才能看到列出的此端口,正如我之前在 studio 启动 WcfSvcHost.exe 时提到的那样。 除此之外的最后一件事就是防火墙。你能把你的配置文件贴在原帖里吗? 将配置添加到原始帖子。谢谢。 使用 Visual Studio 命令提示符安装您的服务,您还应该使用 SvcUtil 生成您的服务代理文件,然后您应该在您的解决方案中引用它们。您这样做了吗? 我尝试使用 SvcUtil 生成 App.config 但它给了我同样的异常“目标机器主动拒绝它..”。我相信,当我们尝试使用此端点添加服务引用时,VS studio 也会这样做。我还卸载了所有防病毒软件并禁用了所有防火墙。没有运气。以上是关于WCF net.tcp - 目标机器拒绝连接的主要内容,如果未能解决你的问题,请参考以下文章
无法建立连接,因为目标机器主动拒绝它 127.0.0.1:3446