不幸的是,MSDN 上的逐步演练文章在有趣的 地方结束了,所以让我们在这里继续。因为有许多可能导致错误的可能性,我在下面描述了几个选项(= 可能导致问题的场景),它们应该有助于故障排除:
第一个选项:尝试指定
net.tcp://localhost:8526/Service1/mex
当您将服务引用添加到新客户端时 - 确保在您执行此操作之前已安装并运行该服务。
说明:后缀“mex”代表“元数据交换”,允许 Visual Studio 下载 WCF 合同的详细信息。此后缀也在演练示例中使用,它是自动添加的(如果通过右键单击“配置服务引用...”重新打开添加的服务引用,您将在地址字段中看到它)。
第二个选项:我在测试演练时注意到的是,有时右键单击服务参考并在上下文菜单中选择“更新服务参考”会有所帮助。
一段时间后,您可以在系统托盘中看到气球消息“您的服务已被托管”。,之后您可以在同一解决方案中启动客户端。在这种情况下,服务是临时创建的,但不是永久部署的——这意味着,如果您停止调试,它就会被删除。因此,您无法从远程 PC 使用此服务,它仅在 Visual Studio 的解决方案中可见。Visual Studio 内部调用该工具
WcfSvcHost.Exe /Service:<Service1Binary> /Configuration:<Service1Config>
使用正确的参数支持它以正确注册服务(您可以在 Visual Studio 的Common7\IDE
子目录中找到此工具,并且还有WcfTestClient.Exe
可用的 - 一个充当客户端的工具,对调试 WCF 非常有用)。
例如,如果您已停止调试,并从 Visual Studio 外部的 Windows 资源管理器启动 client.exe,则它找不到该服务,并且您收到的错误消息正是您在问题中描述的。
微软有两个关于这个问题的有趣链接:
元数据交换问题和发布元数据
请注意,这与第三个选项中描述的部署它不同。
第三个选项:您是否使用InstallUtil来部署服务?在这种情况下,您可能会意外删除[...]/bin/Debug
子目录并且服务无法启动,因为该.EXE
文件丢失了。
注意:如果您使用的是ServiceInstaller项目,则可以避免这种情况,该项目会在注册服务之前复制二进制文件。或者 - 如果您想简单地使用InstallUtil - 您可以在注册之前将服务二进制文件复制到目标目录(包括 .config 文件和 .dll)。
第四种选择:如果您在远程计算机上运行该服务,则需要指定正确的主机名或主机的 IP 地址而不是localhost,并且您需要确保个人防火墙(windows 防火墙或第 3 方)没有阻止端口 8526(示例中使用的端口号)。指定一个例外以允许此端口用于传入和传出流量。
第 5 个也是最后一个选项(更新):命名冲突 - Service1 是服务,也是 Wcf 库中的类名。从服务中的WCF 库中完全限定您正在使用的类名称,即WcfServiceLibrary1.Service1
或重命名该类。Whytheq 自己和一位同事一起找到了它,并在此处发布。
更多阅读:查看我最近发现的这篇文章:“ WCF:一些技巧”。它很好地解释了 WCF 故障排除。我对控制台托管示例所做的唯一更改是将语句替换为using
ServiceHost host = new ServiceHost(typeof(Service));
try
{
host.Open();
Console.WriteLine("WCF Service is ready for requests." +
"Press any key to close the service.");
Console.WriteLine();
Console.Read();
Console.WriteLine("Closing service...");
}
finally
{
if (host!=null) {
host.Close();
host=null;
}
}
如果您想了解更多原因,请查看这篇文章:“代理打开和关闭”。