“找不到具有名称的端点元素...”
Posted
技术标签:
【中文标题】“找不到具有名称的端点元素...”【英文标题】:"Could not find endpoint element with name..." 【发布时间】:2011-03-12 11:08:49 【问题描述】:对不起,问题陈述太长了……我花了两天时间调试,有很多笔记……
我有一个 WCF 数据服务和另一个进程试图通过 TCP 和/或 HTTP 作为客户端连接到它。
我有一个非常简单的测试客户端应用程序,似乎可以正常连接,但更复杂的生产应用程序无法连接(TCP 或 HTTP 都没有)。在这两个客户端项目中,我让 Visual Studio 2008 使用“添加服务引用”生成 app.config,并让它从数据服务中提取元数据。
下面是运行的简单测试客户端的代码:
using Client.MyDataService;
namespace Client
class Program
static void Main(string[] args)
MyDataServiceClient client = new MyDataServiceClient("net.tcp");
client.GetRecords();
下面是更复杂的生产客户端的代码:
DataServiceManager.cs:
using MyServer.MyDataService;
namespace MyServer.DataServiceBridge
class DataServiceManager
MyDataServiceClient dataServiceClient = new MyDataServiceClient("net.tcp");
在主进程中:
DataServiceManager d = new DataServiceManager();
这里是简单客户端和生产客户端的 app.config 文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="net.tcp" closeTimeout="00:01:00" openTimeout="00:01:00"
receiveTimeout="00:10:00" sendTimeout="00:01:00" transactionFlow="false"
transferMode="Buffered" transactionProtocol="OleTransactions"
hostNameComparisonMode="StrongWildcard" listenBacklog="10"
maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10"
maxReceivedMessageSize="65536">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="Transport">
<transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
<message clientCredentialType="Windows" />
</security>
</binding>
</netTcpBinding>
</bindings>
<client>
<endpoint address="net.tcp://localhost:8888/MyDataService"
binding="netTcpBinding" bindingConfiguration="net.tcp" contract="MyDataService.IMyDataService"
name="net.tcp">
<identity>
<userPrincipalName value="COMPUTER_NAME\Username" />
</identity>
</endpoint>
</client>
</system.serviceModel>
</configuration>
在 MyServer 的 bin\Debug\ 文件夹中是 MyServer.exe、app.config。
在 MyDataServiceHost 的 bin\Debug\ 文件夹是 MyDataService.exe, app.config 和 MyDataServiceHost.exe.config。 app.config 和 MyDataServiceHost.exe.config 是 一样的。
这是错误信息:
An exception of type 'System.InvalidOperationException' occurred in System.ServiceModel.dll but
was not handled in user code
Additional information: Could not find endpoint element with name 'net.tcp' and contract
'MyDataService.IMyDataService' in the ServiceModel client configuration section.
This might be because no configuration file was found for your application, or because no endpoint
element matching this name could be found in the client element.
有什么想法吗?我已经筋疲力尽了谷歌。 :-(
【问题讨论】:
可能是错字,但您的错误消息显示:IyDataService。应该是 IMyDataService。 是的,这是为了在此处发布而编辑时的拼写错误。已修复,谢谢! 请不要在标题中重复诸如“WCF”之类的标签。这就是标签的用途。 @CrypticPrime:请您以后保留未编辑的原始版本,如果这是导致错误的原因之一吗?我正在搜索 IyDataService 并且在任何地方都看不到它,这正是我的问题,但是点赞的评论与您的问题内容不符。谢谢 【参考方案1】:已解决
事实证明,我们有一个加载 DLL 的 exe。 DLL 包含 WCF 客户端。 编译时,会生成 MyServer.dll.config,但由于 exe 是本机的(不是 .NET),它不会自动读取 .config 文件。我们需要手动完成。 这个链接允许我手动加载配置并创建一个 CustomChannelFactory 来解决这个问题。
对于其他需要相同东西的人,这里是导致解决方案的链接: http://www.paraesthesia.com/archive/2008/11/26/reading-wcf-configuration-from-a-custom-location.aspx
【讨论】:
【参考方案2】:我遇到过这样的情况
WCF 服务托管在某处 主要项目 “类库”类型的消费者项目具有对 WCF 服务的服务引用 主项目调用消费者项目中的方法现在Consumer项目在我的app.config的<system.serviceModel>
标签中有所有相关的配置设置,它仍然抛出和上面一样的错误。
我所做的只是将相同的标签 <system.serviceModel>
添加到我的主项目的 app.config 文件中,最后我们可以开始了。
就我而言,真正的问题是读取错误的配置文件。它指的是主项目的配置,而不是消费者的 app.config。我花了两个小时才弄明白。
【讨论】:
【参考方案3】:可能只是您编写它的方式,但听起来您的配置文件没有正确复制到目录中。它应该具有与您的应用程序匹配的名称,而不是 app.config。如果您尝试将 app.config 文件的名称更改为 [您的 exe 名称].exe.config 会有所帮助。
【讨论】:
我也试过了。这是行不通的。 app.config 和 MyServer.exe.config 都在其中(我也尝试删除一个或另一个只是为了好玩)。 好吧,仅供参考,app.config 将永远无法工作,因为它不会被拾取。所以这两个应用程序都有一个 .config 文件,其名称与当前 exe 的名称匹配。您是否可能将简单应用程序中的配置复制到复杂应用程序中而忘记更改配置名称? 很遗憾,我希望是这样。所有文件名都正确。 Hrmmm...我刚刚注意到 VS 正在生成 MyServer.dll.config 而不是 *.exe.config 文件。这是一个问题吗?我需要对 DLL 做些什么吗? 是的,我发现这与有效的简单客户端没有直接关系。大型生产应用程序有一个 BigServer.exe 应用程序,它加载了我们编译到 MyServer.dll 中的所有代码。也许这应该是 *** 上的一个单独问题?【参考方案4】:当 EXE 使用 DLL 时,它寻找的配置文件不是 DLLName.Dll.Config 它的 EXEName.exe.config ,更改生成的配置文件的名称并将其复制到执行路径。它应该可以工作。
干杯!!!!!!!!!
【讨论】:
【参考方案5】:在这些特定情况下可能使用不同解决方案的类似情况:
像上面的帖子一样,我有一个在 DLL 中定义的 EXE 托管客户端。
与上述情况不同的是,我的客户端使用 UDP 探测 发现服务端点(显然服务已启用 MEX)
ClientProxy 继承DuplexClientBase,并且重载的实例化方法允许您指定绑定和端点,而无需任何配置文件。
一个 VB 示例,我发现了一个端点 (ep),并且我知道绑定是禁用了安全性的 TCP,所以我可以实例化并使用回调客户端:
myClientProxy = New ClientProxy(New InstanceContext(Me), New NetTcpBinding(SecurityMode.None), ep.Address)
【讨论】:
以上是关于“找不到具有名称的端点元素...”的主要内容,如果未能解决你的问题,请参考以下文章