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

この問題は、自動生成されたサービス参照クラスのクライアント コンストラクターが原因でした。クライアントには 5 つのコンストラクタがあり、そのうちの 4 つは構成ファイルを探しています。何らかの理由で、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 に答える