很抱歉这个问题很长......我花了两天时间调试并且有很多笔记......
我有一个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。
在MyDataSeriviceHost的bin \ Debug \中 文件夹是MyDataService.exe, app.config和 MyDataSeriviceHost.exe.config。 app.config和 MyDataSeriviceHost.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.
任何想法是怎么回事?谷歌已经筋疲力尽了。 : - (
答案 0 :(得分:18)
解决
事实证明我们有一个加载DLL的exe。 该DLL包含WCF客户端。 编译时,会生成MyServer.dll.config,但由于exe是本机的(不是.NET),因此它不会自动读取.config文件。我们需要手动完成。 此链接允许我手动加载配置并创建CustomChannelFactory&lt;&gt;解决这个问题。
对于需要同样事情的其他人,这里是导致解决方案的链接: http://www.paraesthesia.com/archive/2008/11/26/reading-wcf-configuration-from-a-custom-location.aspx
答案 1 :(得分:5)
我有这种情况,我有
现在,Consumer项目在我的app.config的<system.serviceModel>
标签中设置了所有相关配置,它仍然抛出与上面相同的错误。
我所做的只是将相同的标记<system.serviceModel>
添加到我的主项目的app.config文件中,最后我们很高兴。
真正的问题,就我的情况而言,它正在读取错误的配置文件。而不是消费者的app.config,它是指主要的proj的配置。我花了两个小时来弄明白。
答案 2 :(得分:3)
可能只是你编写的方式,但听起来你的配置文件没有被正确地复制到目录中。它应该与您的应用程序具有匹配的名称而不是app.config。如果您尝试将app.config文件的名称更改为[您的exe名称] .exe.config可以帮助您。
答案 3 :(得分:1)
当EXE使用DLL时,它查找的配置文件不是DLLName.Dll.Config其EXEName.exe.config,更改生成的配置文件的名称并将其复制到执行路径。它应该工作。
干杯!!!!!!!!!
答案 4 :(得分:0)
在这些特定情况下可能使用的不同解决方案的类似情况:
与上述帖子一样,我在DLL中定义了一个EXE托管客户端。
与上述情况不同的是我的客户端正在使用UDP探测器 发现服务端点(显然服务已启用MEX)
ClientProxy继承DuplexClientBase,重载的实例化方法允许您指定绑定和端点,而无需任何配置文件。
一个VB示例,我发现了一个端点(ep),我知道绑定是TCP,禁用了安全性,所以我可以实例化并使用回调客户端:
myClientProxy = New ClientProxy(New InstanceContext(Me), New NetTcpBinding(SecurityMode.None), ep.Address)