gpt4 book ai didi

c# - 从外部解决方案使用Windows服务中托管的WCF服务

转载 作者:太空狗 更新时间:2023-10-29 22:19:45 24 4
gpt4 key购买 nike

我使用以下演练来设置Windows服务中托管的WCF库:

http://msdn.microsoft.com/en-us/library/ff649818.aspx

使用者winform在同一解决方案中,位于我的工作PC的C:驱动器本地。

演练工作,即winforms按钮为我提供了正确的答案。

如果我在其中具有单个Windows Forms项目的C-Drive上创建新的解决方案,则无法成功向此运行的服务添加service reference,我将收到以下消息:



详细消息显示以下内容:

The URI prefix is not recognized. Metadata contains a reference that cannot be resolved: 'net.tcp://localhost:8526/Service1'. Could not connect to net.tcp://localhost:8526/Service1. The connection attempt lasted for a time span of 00:00:02.0020000. TCP error code 10061: No connection could be made because the target machine actively refused it 127.0.0.1:8526. No connection could be made because the target machine actively refused it 127.0.0.1:8526 If the service is defined in the current solution, try building the solution and adding the service reference again.



为什么我可以将此“服务引用”添加到与“服务”相同的解决方案中的项目,而不是来自其他解决方案中的项目?

编辑

我的同事在MSDN文章中发现错误-我已经详细介绍了他的查找HERE

最佳答案

不幸的是,MSDN上的step by step walkthrough article 很有趣,因此在这里继续。因为有很多可能导致错误的可能性,所以我在下面描述了几个选项(= scencarios可能导致此问题),这应该有助于进行故障排除:

第一个选项:尝试指定

 net.tcp://localhost:8526/Service1/mex

在将服务引用添加到新客户端时,请确保已安装并运行该服务,然后再执行此操作。

说明:后缀“mex”代表“元数据交换”,并允许Visual Studio下载WCF契约(Contract)的详细信息。该后缀还用于本演练示例中,它是自动添加的(如果重新打开,然后右键单击“配置服务引用...”,则添加后的服务引用,您将在“地址”字段中看到该后缀。 ”)。

第二个选项:我在测试演练时注意到,有时候右键单击服务引用并在连接菜单“更新服务引用”中进行选择有时会有所帮助。

在系统托盘
中的 片刻之后,您会看到气球消息“您的服务已托管”。 ,之后您可以在同一解决方案中启动客户端。在这种情况下,该服务是临时创建的,但不会永久部署-这意味着,如果停止调试,则会将其删除。因此,您不能从远程PC使用此服务,它只能在Visual Studio的解决方案中看到。 Visual Studio在内部调用该工具
WcfSvcHost.Exe /Service:<Service1Binary> /Configuration:<Service1Config> 

用正确的参数支持它以正确注册服务(您可以在Visual Studio的Common7\IDE子目录中找到此工具,并且还有WcfTestClient.Exe可用-充当客户端的工具,对于调试WCF非常有用)。

例如,如果您停止调试,并从Visual Studio外部的Windows资源管理器启动client.exe,则它将找不到该服务,并且您将完全收到问题中所描述的错误消息。

在Microsoft,有两个有趣的链接与此相关:
Problem with Metadata ExchangePublishing Metadata

请注意, 3rd选项中所述的部署不同。

第三个选项:您是否使用 InstallUtil 来部署服务?在这种情况下,可能会由于意外丢失[...]/bin/Debug文件而意外删除了.EXE子目录而导致服务无法启动。

注意:如果您使用的是 ServiceInstaller 项目,则可以避免这种情况,该项目会在注册服务之前复制二进制文件。或者-如果您想简单地使用 InstallUtil -您可以在注册之前将服务二进制文件复制到目标目录(包括.config文件和.dlls)。

第四个选项:如果在远程计算机上运行服务,则需要指定主机的正确主机名或IP地址而不是localhost,并且需要确保个人防火墙(Windows防火墙或第3方)不会阻止端口8526 (此示例中使用的端口号)。指定一个异常(exception),以允许该端口进行传入和传出通信。

第五个也是最后一个选项(UPDATE):命名冲突-Service1是服务,也是Wcf库中的类名。从服务中的 WCF库中完全限定您正在使用的类名称,即WcfServiceLibrary1.Service1或重命名该类。 Whytheq自己和一位同事一起找到了它,并将其发布为here

更多阅读:查看这篇文章,我最近发现它是“WCF: a few tips”。它很好地解释了WCF的故障排除。我对控制台托管示例所做的唯一更改是将
using语句替换为,用 a将替换为
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;
}
}

如果您想了解更多原因,请查看本文:“ Proxy open and close”。

关于c# - 从外部解决方案使用Windows服务中托管的WCF服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12750413/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com