当我创建ChannelFactory的新实例时:
var factory = new ChannelFactory<IMyService>();
我创建了一个新频道,我有一个例外,说Endpoint的地址为空。
我在web.config中的配置如上所述,一切都是应该的(特别是端点的地址)。
如果我创建一个新的MyServiceClientBase,它会从我的通道工厂加载所有配置:
var factoryWithClientBase = new MyServiceClientBase().ChannelFactory;
Console.WriteLine(factoryWithClientBase.Endpoint.Address); //output the configuration inside the web.config
var factoryWithChannelFactory = new ChannelFactory<IMyService>();
Console.WriteLine(factoryWithChannelFactory.Endpoint.Address); //output nothing (null)
为什么?
答案 0 :(得分:9)
如果在Web.Config:
中为端点提供类似名称,它是否有效<endpoint address="http://localhost:2000/MyService/" binding="wsHttpBinding"
behaviorConfiguration="wsHttpBehaviour" contract="IService"
name="MyWsHttpEndpoint" />
使用ChannelFactory创建频道,如下所示:
var factory = new ChannelFactory<IMyService>("MyWsHttpEndpoint");
答案 1 :(得分:5)
我终于找到了答案。 ChannelFactory不会从您的Web.Config / app.config中读取信息。 ClientBase(然后使用ChannelFactory)可以。
所有这些都花了我几个小时的工作,但我终于找到了一个合理的理由。
:)
答案 2 :(得分:3)
由new运算符实例化的ChannelFactory从web.config读取。上面的AnAngel回答是正确的。 您只需确保为端点提供名称。 并确保正确设置端点合约(非常重要)
我有一段经验,我的web.config是由VS生成的,并且端点契约设置为ServiceReference中的合同(作为添加服务引用的结果),这不是我想要的。虽然它与我的原始合同具有相似的名称(但位于不同的名称空间中)
<endpoint address="http://localhost:2000/MyService/" binding="wsHttpBinding"
behaviorConfiguration="wsHttpBehaviour" contract="TheCorrectNamespace.IService"
name="MyWsHttpEndpoint" />
提问者没有发布他的web.config所以我假设你很可能犯了我做的错误(指定端点的错误合同)