参照しましたが、カスタム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
}
参考文献