【问题标题】:Move C# WCF Extensibility code to Configuration File将 C# WCF 可扩展性代码移动到配置文件
【发布时间】:2012-10-03 18:56:53
【问题描述】:

以下代码将 ParameterInspector 添加到端点。

ChannelFactory<ITest> factory = new ChannelFactory<ITest>("BasicHttpBinding_ITest");
OperationProfilerManager clientProfilerManager = new OperationProfilerManager();
factory.Endpoint.Behaviors.Add(new OperationProfilerEndpointBehavior(clientProfilerManager));
ITest proxy = factory.CreateChannel();

作为一种好的做法,我们正在尝试将所有这些代码移至 Web.config。所以只是像这样创建工厂

ChannelFactory<ITest> factory = new ChannelFactory<ITest>("BasicHttpBinding_ITest");

或者这个 -

ChannelFactory<ITest> factory = new ChannelFactory<ITest>();

应该从配置中获取扩展元素。通过以下配置,不会触发 IParameterInspectorBeforeCallAfterCall 方法。您能否指出我们在遵循 Web.config 时的错误 -

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_ITest" />
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://n1:8000/Service" binding="basicHttpBinding"
            bindingConfiguration="BasicHttpBinding_ITest" contract="ServiceReference1.ITest"
            name="BasicHttpBinding_ITest" />
    </client>
    <behaviors>
        <endpointBehaviors>
            <behavior name="todo">                
            </behavior>
        </endpointBehaviors>
    </behaviors>
    <extensions>
        <behaviorExtensions>
            <add name="OperationProfilerEndpointBehavior" type="SelfHostedServiceClient.OperationProfilerEndpointBehavior, SelfHostedServiceClient"/>
        </behaviorExtensions>
    </extensions>
</system.serviceModel>

感谢您的帮助。

参考:Carlos blog

编辑:分辨率

根据 Carlos 的回答,我采取了以下步骤来解决问题。

步骤 1. 创建派生自 BehaviorExtensionElement 的 OperationProfilerBehaviorElement 类。该类负责实例化实现IEndpointBehavior

的类
class OperationProfilerBehaviorElement : BehaviorExtensionElement  {
    public override Type BehaviorType
    {
        get {
            return typeof(OperationProfilerEndpointBehavior);
        }
    }

    protected override object CreateBehavior()
    {
        OperationProfilerManager clientProfilerManager = new OperationProfilerManager();
        return new OperationProfilerEndpointBehavior(clientProfilerManager);
    } }

第 2 步。这个类必须在 Web.config 中声明如下,

<extensions>
  <behaviorExtensions>
    <add name="OperationProfilerBehavior" type="SelfHostedServiceClient.OperationProfilerBehaviorElement, SelfHostedServiceClient"/>
  </behaviorExtensions>
</extensions>

第 3 步。添加 端点行为,如下所示,

<behaviors>
  <endpointBehaviors>
    <behavior name="**InspectParameters**">
      <OperationProfilerBehavior/>
    </behavior>
  </endpointBehaviors>
</behaviors>

步骤 4. 如下设置端点的 behaviorConfiguration 属性等于 InspectParameters,

  <endpoint address="http://localhost:8000/Service" behaviorConfiguration="InspectParameters"
    binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ITest"
    contract="ServiceReference1.ITest" name="BasicHttpBinding_ITest" />

现在我能够在单个 C# 行中初始化工厂,并且默认情况下从 Web.config 添加了 参数检查器

ChannelFactory 工厂 = new ChannelFactory("BasicHttpBinding_ITest");

【问题讨论】:

    标签: wcf


    【解决方案1】:

    在配置的&lt;extensions&gt; / &lt;behaviorExtensions&gt; 部分中引用的类型OperationProfilerEndpointBehavior 不应该是实现IEndpointBehavior 的类 - 它应该是从BehaviorElementExtension 继承的类型,并且该类是应该的类创建行为。

    http://blogs.msdn.com/b/carlosfigueira/archive/2011/06/28/wcf-extensibility-behavior-configuration-extensions.aspx 上查看有关行为扩展的更多信息。

    【讨论】:

    猜你喜欢
    • 2012-07-31
    • 2019-02-04
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    相关资源
    最近更新 更多