2013-03-26 33 views
6

我按照this article,並創造了MyMessageInspectorMyEndPointBehavior clases如下:如何將自定義EndPointBehavior添加到服務的web.config中?

public class MyMessageInspector : IDispatchMessageInspector 
{ 
    public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext) 
    { 
     Console.WriteLine("Incoming request: {0}", request); 
     return null; 
    } 

    public void BeforeSendReply(ref Message reply, object correlationState) 
    { 
    } 
} 

public class MyEndPointBehavior : IEndpointBehavior 
{ 
    #region IEndpointBehavior Members 

    public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) 
    { 
    } 

    public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) 
    { 
    } 

    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) 
    { 
     ChannelDispatcher channelDispatcher = endpointDispatcher.ChannelDispatcher; 
     if (channelDispatcher != null) 
     { 
      foreach (EndpointDispatcher ed in channelDispatcher.Endpoints) 
      { 
       ed.DispatchRuntime.MessageInspectors.Add(new MyMessageInspector()); 
      } 
     } 
    } 

    public void Validate(ServiceEndpoint endpoint) 
    { 
    } 

    #endregion 
} 

如何MyEndPointBehavior添加到web.config?

我已經添加了以下擴展名:

<extensions> 
    <behaviorExtensions> 
    <add name="myMessageInspector" type="MessageInspectorProject.MyEndPointBehavior, MessageInspectorProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/> 
    </behaviorExtensions> 
</extensions> 

但是當我嘗試在下面使用它,它抱怨:

<serviceBehaviors> 
    <behavior> 
     <myMessageInspector/> 

它的抱怨是如下:

配置中的元素無效。擴展名「myMessageInspector」不是從正確的擴展基類型「System.ServiceModel.Configuration.BehaviorExtensionElement」派生的。

如何將MyEndPointBehavior添加到web.config?

+3

大鏈接,你想做什麼:http://weblogs.asp.net/paolopia/archive/2007 /08/23/writing-a-wcf-message-inspector.aspx – Tanner 2013-03-26 12:21:57

+0

您是否嘗試過使用此標記: Tanner 2013-03-26 12:26:38

+1

錯誤消息說明了一切,您的自定義擴展類型必須從System.ServiceModel.Configuration.BehaviorExtensionElement '。你可以創建一個新的類,或者從中派生出MyMessageInspector。你必須重寫'CreateBehavior()'和'BehaviorType'成員。 'BehaviorType'將返回'typeof(MyEndPointBehavior)'和'CreateBehavior()'將返回這個類的一個實例。 – Vasea 2013-03-26 12:47:27

回答

12

您還必須創建自定義BehaviorExtensionElement並在web.config文件中使用它。有很多文章可以幫助你喜歡這些

http://weblogs.asp.net/paolopia/writing-a-wcf-message-inspector

http://cgeers.com/2011/05/10/wcf-message-logging/

http://burcakcakiroglu.com/?p=2083

http://trycatch.me/adding-custom-message-headers-to-a-wcf-service-using-inspectors-behaviors/

反正修復您的代碼,以這種方式

public class MyMessageInspector : IDispatchMessageInspector 
{ 
    public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext) 
    { 
     Console.WriteLine("Incoming request: {0}", request); 
     return null; 
    } 

    public void BeforeSendReply(ref Message reply, object correlationState) 
    { 
    } 
} 

public class MyEndPointBehavior : IEndpointBehavior 
{ 
    #region IEndpointBehavior Members 

    public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) 
    { 
    } 

    public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) 
    { 
    } 

    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) 
    { 
     ChannelDispatcher channelDispatcher = endpointDispatcher.ChannelDispatcher; 
     if (channelDispatcher != null) 
     { 
      foreach (EndpointDispatcher ed in channelDispatcher.Endpoints) 
      { 
       ed.DispatchRuntime.MessageInspectors.Add(new MyMessageInspector()); 
      } 
     } 
    } 

    public void Validate(ServiceEndpoint endpoint) 
    { 
    } 

    #endregion 
} 

這裏添加新BehaviorExtensionElement

public class CustomBehaviorExtensionElement : BehaviorExtensionElement 
{ 
    protected override object CreateBehavior() 
    { 
     return new MyEndPointBehavior(); 
    } 

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

和更新您的web.config

<extensions> 
    <behaviorExtensions> 
    <add name="myMessageInspector" type="MessageInspectorProject.CustomBehaviorExtensionElement, MessageInspectorProject"/> 
    </behaviorExtensions> 
</extensions> 

<behaviors> 
    <endpointBehaviors> 
    <behavior> 
     <myMessageInspector /> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 
相關問題