0

Castle WcfIntegration 3.0 に WCF クライアントを登録しようとしています。次の構文に何か問題がありますか?

Container.Kernel.Register( Component.For(serviceType) .AsWcfClient(new DefaultClientModel { Endpoint = WcfEndpoint .FromConfiguration( serviceType.Name. Substring(1) + "Client") }) .LifeStyle.Is(ライフスタイル));

私が抱えている問題は、WCF サービス操作のコンテキストで、ServiceSecurityContext.Current が null の場合です。これは、古いバージョンの Castle (1.0.3.0) では発生しませんでした。それが私が間違っていることなのか、それともCastleへの変更によってServiceSecurityContext.Currentが以前のように入力されるようにするために他の変更が必要なのかを理解しようとしています。

ありがとう

4

1 に答える 1

0

記録のために、これが私が使用した構文であり、最終的に機能しました。(より多くのキャッスルのドキュメントが必要であることを考えると、動作する構文の例はどれも問題ないと思います)!

Container.Kernel.Register(Component.For(serviceType)
            .LifeStyle.Is(lifestyle)
            .DependsOn(new
            {
                clientModel = new DefaultClientModel
                {
                    Endpoint = WcfEndpoint
                    .FromConfiguration(serviceType.Name.Substring(1) + "Client")
                }
            }));

また、記録のために、 ServiceSecurityContext.Current が null であるという問題は、別の理由で発生していました。

構成ファイルに変更を加えましたが、これは重要ではないと考えていました (特定のクラスが廃止されたように見えたため) が、非常に重要であることが判明しました (これらのクラスは非常に必要とされていました)。

城の構成ファイルの「コンポーネント」ノードは次のようになります。

<component id="FederatedServiceHostBuilder"
           service="Castle.Facilities.WcfIntegration.IServiceHostBuilder`1[[Castle.Facilities.WcfIntegration.DefaultServiceModel, 
           Castle.Facilities.WcfIntegration, Version=3.0.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc]], Castle.Facilities.WcfIntegration"
           type="OurCustomer.Framework.Service.Security.FederatedServiceHostBuilder, OurCustomer.Framework.Service"
           lifestyle="Transient">
  <interceptors>
    <interceptor>${InstrumentationInterceptor}</interceptor>
  </interceptors>
</component>

「FederatedServiceHostBuilder」クラス:

/// <summary>
/// The default implementation of <see cref="IServiceHostBuilder{M}"/>.
/// </summary>
public class FederatedServiceHostBuilder : AbstractServiceHostBuilder<DefaultServiceModel>
{
    /// <summary>
    /// Constructs a new <see cref="FederatedServiceHostBuilder"/>.
    /// </summary>
    /// <param name="kernel">The kernel.</param>
    public FederatedServiceHostBuilder(IKernel kernel)
        : base(kernel)
    {
    }

    #region AbstractServiceHostBuilder Members
    /// <summary>
    /// 
    /// </summary>
    /// <param name="model"></param>
    /// <param name="serviceModel"></param>
    /// <param name="baseAddresses"></param>
    /// <returns></returns>
    protected override ServiceHost CreateServiceHost(ComponentModel model,
                                                     DefaultServiceModel serviceModel,
                                                     params Uri[] baseAddresses)
    {
        return CreateServiceHost(model, GetEffectiveBaseAddresses(serviceModel, baseAddresses));
    }
    /// <summary>
    /// 
    /// </summary>
    /// <param name="model"></param>
    /// <param name="baseAddresses"></param>
    /// <returns></returns>
    protected override ServiceHost CreateServiceHost(ComponentModel model,
                                                     params Uri[] baseAddresses)
    {
        return new FederatedServiceHost(model, baseAddresses);
    }
    /// <summary>
    /// 
    /// </summary>
    /// <param name="serviceType"></param>
    /// <param name="baseAddresses"></param>
    /// <returns></returns>
    protected override ServiceHost CreateServiceHost(Type serviceType,
                                                     params Uri[] baseAddresses)
    {
        return new FederatedServiceHost(serviceType, baseAddresses);
    }

    #endregion
}

そして (重要な) FederatedServiceHost クラス:

public class FederatedServiceHost : Castle.Facilities.WcfIntegration.DefaultServiceHost
{
    /// <summary>
    /// 
    /// </summary>
    /// <param name="model"></param>
    /// <param name="baseAddresses"></param>
    public FederatedServiceHost(ComponentModel model, params Uri[] baseAddresses)
        : base(model, baseAddresses)
    {
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="serviceType"></param>
    /// <param name="baseAddresses"></param>
    public FederatedServiceHost(Type serviceType, params Uri[] baseAddresses)
        : base(serviceType, baseAddresses)
    {
    }

    /// <summary>
    /// <remarks />
    /// </summary>
    protected override void OnOpening()
    {
        FederatedServiceCredentials.ConfigureServiceHost(this);
        base.OnOpening();
    }
}

つまり、「FederatedServiceCredentials.ConfigureServiceHost(this)」行が欠落していたため、ServiceSecurityContext.Current が null になりました。

于 2012-08-26T10:52:24.000 に答える