【问题标题】:Windsor WCF Client - "Could not find default endpoint element" when not present in configWindsor WCF 客户端 - 配置中不存在时“找不到默认端点元素”
【发布时间】:2014-10-16 10:00:30
【问题描述】:

如果没有在 Web/App.config 文件中明确定义,我无法让 Windsor WCF 工具生成客户端端点。

我的合同、客户端和回调是作为服务参考生成的,我想以编程方式注册所有内容,而不使用配置文件。但是,当 App/Web.config 中不存在端点信息时,我会收到此错误:

错误:找不到引用的默认端点元素 ServiceModel 客户端中的合同“ServiceReference1.IWcfContract” 配置部分。这可能是因为没有配置文件 为您的应用程序找到,或者因为没有匹配的端点元素 该合同可以在客户端元素中找到。

注册

Component.For<IWcfContract>()
    .ImplementedBy<WcfContractClient>()
    .AsWcfClient(new DefaultClientModel(
        WcfEndpoint
            .ForContract<IWcfContract>()
            .BoundTo(MyConfig.NetTcpBinding)
            .At(MyConfig.WcfHostAddressAndPort)),
    .LifestyleTransient());
Component.For<IWcfContractClientFactory>()
    .AsFactory(new WcfContractClientFactorySelector())

类型化工厂

IWcfContractCreate(WcfContractClientCallback callback);
void Release(IWcfContractinstance);

工厂选择器

public class WcfContractClientFactorySelector : DefaultTypedFactoryComponentSelector
{
    protected override IDictionary GetArguments(MethodInfo method, object[] arguments)
    {
        Arguments args = new Arguments();
        args.Add("callbackInstance", new InstanceContext(arguments[0]));
        return args;
    }
}

解决客户问题

IWcfContractClientFactory factory = container.Resolve<IWcfContractClientFactory>();
IWcfContract client = factory.Create(new WcfContractClientCallback());

此时,如果我在 Web/App.config 文件中有端点信息,那么一切正常。如果我把它拿出来,我会收到上面提到的错误。谢谢!

【问题讨论】:

  • 什么是MyConfig?如果它试图去 App.config 似乎与它有关。
  • 它是绑定和端点地址,可以在服务和客户端之间共享。这样我就不会在每次进行更改时更新多个配置文件。
  • 问题实际上是它不会从 MyConfig 中读取。它要么是 App/Web.config,要么什么都没有。
  • 可以肯定的是,您不会删除MyConfig 指向的地址,对吧?也许如果您发布了 App.config 的一小部分,它显示了您要删除的内容(注释掉)以及 MyConfig 指向的内容。 MyConfig 是你的班级,还是第 3 方班级?
  • 啊,我刚刚想通了。它是指向 App/Web.config 文件的服务参考合同接口上自动生成的ServiceContractAttribute。我已将其删除,但现在有其他错误。我会尽快发布答案。

标签: c# wcf castle-windsor windsor-facilities


【解决方案1】:

此问题是由自动生成的服务引用类中的客户端构造函数引起的。客户端有五个构造函数,其中四个在寻找配置文件。出于某种原因,Windsor 的 WCF 设施正在使用这些构造函数。此外,这些构造函数位于标记为 DebuggerStepThrough 的类中,因此调试器隐藏了异常。

解决方案是让 Windsor 使用最后一个不需要配置文件的构造函数,但我不得不删除 .AsWcfClient。如果有人知道使用.AsWcfClient 而不遇到此构造函数问题的方法,请发布另一个答案,我会接受。谢谢。

服务引用构造函数

    public SearchServiceContextClient(InstanceContext callbackInstance)
    public SearchServiceContextClient(InstanceContext callbackInstance, string endpointConfigurationName)
    public SearchServiceContextClient(InstanceContext callbackInstance, string endpointConfigurationName, string remoteAddress)
    public SearchServiceContextClient(InstanceContext callbackInstance, string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress)
    public SearchServiceContextClient(InstanceContext callbackInstance, Binding binding, EndpointAddress remoteAddress)

注册

Component.For<IWcfContract>()
    .ImplementedBy<WcfContractClient>()
    .DependsOn(new
    {
        binding = MyConfig.NetTcpBinding,
        remoteAddress = new EndpointAddress(MyConfig.WcfHostAddressAndPort)
    })
.LifestyleTransient()),
Component.For<IWcfContractClientFactory>()
    .AsFactory(new WcfContractClientFactorySelector())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-08
    • 2014-10-11
    相关资源
    最近更新 更多