2

参照しましたが、カスタムWCF動作拡張要素タイプが見つからないのはなぜですか?; しかし、以下は別の質問です

以下に示すように、カスタムのBehaviorExtensionElementがあります。サービスの実行中に、コンストラクターが呼び出されます。ただし、CreateBehavior()メソッドは呼び出されません。したがって、私のIEndpointBehaviorは構築されていません。

サービスは例外なく正常に動作します。

CreateBehavior()メソッドが呼び出されない理由はありますか?

注:からWebサービスアプリケーションを実行していますVisual Studio 2010

構成

  <endpointBehaviors>
    <behavior name="EndpointBehavior">
      <XMessageValidator validateRequest="True" validateReply="true" validateWSE="true">
      </XMessageValidator>
    </behavior>
  </endpointBehaviors>


 //Other config entries

<extensions>
  <behaviorExtensions>
    <add name="XMessageValidator" type="MessageInspectorLibrary.ValidationBehaviorExtensionElement, MessageInspectors, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
  </behaviorExtensions>
</extensions>

BehaviorExtensionElement

public class ValidationBehaviorExtensionElement : BehaviorExtensionElement
{
    public ValidationBehaviorExtensionElement()
    {
        //Constructor
    }

    public override Type BehaviorType 
    { 
        get
        {
            return typeof(MessageValidationBehavior);
        } 
    }

    protected override object CreateBehavior()
    {
        throw new Exception("My CreateBehavior");
        return null;

    }

    [ConfigurationProperty("validateRequest", DefaultValue = false, IsRequired = false)]
    public bool ValidateRequest
    {
        get { return (bool)base["validateRequest"]; }
        set { base["validateRequest"] = value; }
    }

    [ConfigurationProperty("validateReply", DefaultValue = false, IsRequired = false)]
    public bool ValidateReply
    {
        get { return (bool)base["validateReply"]; }
        set { base["validateReply"] = value; }
    }

    [ConfigurationProperty("validateWSE", DefaultValue = false, IsRequired = false)]
    public bool ValidateWSE
    {
        get { return (bool)base["validateWSE"]; }
        set { base["validateWSE"] = value; }
    }

}

IEndpointBehavior

public class MessageValidationBehavior : IEndpointBehavior
{
    XmlSchemaSet schemaSet; 
    bool validateRequest; 
    bool validateReply;
    bool validateWSE;

    public MessageValidationBehavior(XmlSchemaSet schemaSet, bool inspectRequest, bool inspectReply, bool inspectWSE)
    {
        this.schemaSet = schemaSet;
        this.validateReply = inspectReply;
        this.validateRequest = inspectRequest;
        this.validateWSE = inspectWSE;

        throw new Exception("My MessageValidationBehavior");
    }


    #region IEndpointBehavior Members

    public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
    {
    }

    public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime)
    {
        ValidationMessageInspector inspector = new ValidationMessageInspector(schemaSet, validateRequest, validateReply, validateWSE, true);
        clientRuntime.MessageInspectors.Add(inspector);
    }

    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher)
    {
        ValidationMessageInspector inspector = new ValidationMessageInspector(schemaSet, validateRequest, validateReply, validateWSE, false);
        endpointDispatcher.DispatchRuntime.MessageInspectors.Add(inspector);
    }

    public void Validate(ServiceEndpoint endpoint)
    {
    }

    #endregion
}

参考文献

  1. http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/6be701c0-25f9-4850-82f9-62a9b8e9ac04/
4

2 に答える 2

2

注:質問で述べたように、サービスは次の変更を行わなくても適切な応答メッセージを表示します。また、ValidationBehaviorExtensionElementクラスが呼び出されていました。

解決

これCreateBehavior()は、サービス名を正しくしたときに呼び出されます。つまり、namespace.servicename

私が理解しているBehaviorExtensionのは、サービス名に関係なく作成されるということです。ただしEndPointBehavior、サービス名が適切な場合にのみ作成されます。これに関するアイデア/リファレンスがあれば、詳細を歓迎します。

ここに画像の説明を入力してください

以下は完全なserviceModel構成です

<system.serviceModel>

<services>

  <service
          name="WcfServiceApp001.Service1"
          behaviorConfiguration="InternalPayrollBehavior">
    <endpoint address="" binding="basicHttpBinding"
              behaviorConfiguration="EndpointBehavior"
              contract="WcfServiceApp001.IService1"
              />
  </service>
</services>

<behaviors>
  <serviceBehaviors>
    <behavior name="InternalPayrollBehavior">
      <serviceMetadata httpGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>
  </serviceBehaviors>

  <endpointBehaviors>
    <behavior name="EndpointBehavior">
      <XMessageValidator validateRequest="True" validateReply="true" validateWSE="true">
      </XMessageValidator>
    </behavior>
  </endpointBehaviors>
</behaviors>

<extensions>
  <behaviorExtensions>
    <add name="XMessageValidator" type="MessageInspectorLibrary.ValidationBehaviorExtensionElement, MessageInspectors, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
  </behaviorExtensions>
</extensions>

<serviceHostingEnvironment multipleSiteBindingsEnabled="false" />
</system.serviceModel>
于 2013-03-25T13:50:44.600 に答える
1

カプセル化することをお勧めしますbehaviors node

 <behaviors>
  ....
  <endpointBehaviors>
    <behavior name="EndpointBehavior">
      <XMessageValidator validateRequest="True" validateReply="true" validateWSE="true">
      </XMessageValidator>
    </behavior>
  </endpointBehaviors>
  ....
 </behaviors>
于 2013-03-25T11:06:03.597 に答える