1

如果没有在 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 文件中有端点信息,那么一切正常。如果我把它拿出来,我会收到上面提到的错误。谢谢!

4

1 回答 1

0

此问题是由自动生成的服务引用类中的客户端构造函数引起的。客户端有五个构造函数,其中四个在寻找配置文件。出于某种原因,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())
于 2014-08-22T16:04:49.013 回答