2011-06-10 13 views
9

? Estoy intentando crear y configurar un Inspector de mensajes para realizar alguna autenticación de una solicitud de WCF Rest HTTP. Estoy usando 4.0 para tratar de evitar el WCF Starter Kit aunque logré que funcione un RequestInterceptor viejo de la manera que quiero. El problema con el uso de RequestInterceptor es que perdí las características de AutomaticFormatSelectionEnabled proporcionadas por WebHttpBehavior que realmente quiero conservar.¿Cómo se configura un MessageInspector al usar StandardEndpoints en WCF REST 4.0

Así que mi pregunta es ¿cómo configuro el Inspector de mensajes de una manera que todavía utilizo el WebHttpBehavior y guardo sus características.

Mi web.config se parece a esto

<standardEndpoints> 
    <webHttpEndpoint> 
    <!-- the "" standard endpoint is used by WebServiceHost for auto creating a web endpoint. --> 
    <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true" /> 
    <!-- Disable the help page for the directory end point--> 
    <standardEndpoint name="DirectoryEndpoint"/> 
    </webHttpEndpoint> 
</standardEndpoints> 

Respuesta

19

Una manera de manejar esto es crear tres objetos.

  1. El inspector mensaje, responsable de analizar la petición/respuesta
  2. El comportamiento en servicio, automáticamente inyecta el inspector en el tubería
  3. La sección de configuración, permite el comportamiento que se utilizará en el Web .config

en primer lugar crear el inspector mensaje mediante la implementación de IDispatchMessageInspector y poniendo el código de validación en el After Método ReceiveRequest:

public class HmacVerificationInspector : IDispatchMessageInspector 
{ 

    #region IDispatchMessageInspector Members 

    public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, 
     System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext) 
    { 
      MessageBuffer buffer = request.CreateBufferedCopy(Int32.MaxValue); 
      request = buffer.CreateMessage(); 
      Message dupeRequest = buffer.CreateMessage(); 

      ValidateHmac(dupeRequest); 

      buffer.Close(); 

     return null; 
    } 

    public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply, 
     object correlationState) 
    { 


    } 

    #endregion 
} 

Es importante crear una copia en búfer del mensaje al leerlo. Los mensajes solo se pueden abrir una vez y no crear una copia generará problemas en la tubería. Mi implementación de ValidateHmac arroja una excepción si falla. Esto evita que se llame al servicio real.

En segundo lugar, cree un comportamiento para su inspector. Utilizaremos el comportamiento para inyectar el inspector en el tiempo de ejecución de WCF. Para crear el comportamiento, derivar una clase de IEndpointBehavior lo que parece que este Aviso

public class HmacVerificationBehavior : IEndpointBehavior 
    { 
     #region IEndpointBehavior Members 

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

     } 

     public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime) 
     { 

     } 

     public void ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher) 
     { 
      HmacVerificationInspector inspector = new HmacVerificationInspector(); 

      endpointDispatcher.DispatchRuntime.MessageInspectors.Add(inspector); 
     } 

     public void Validate(ServiceEndpoint endpoint) 
     { 

     } 

     #endregion 
    } 

puedo crear una nueva instancia de mi inspector (HmacVerificationInspector) e inyectarlo mediante programación en el tiempo de ejecución.

Finalmente, el último paso es crear una sección de configuración. Podemos usar esto para aplicar el comportamiento en la configuración web (y así poder activarlo y desactivarlo a través de la configuración). Crear una nueva clase y heredar de BehaviorExtensionElement y IServiceBehavior:

public class HmacVerificationConfigurationSection : BehaviorExtensionElement, IServiceBehavior 
{ 
    #region IServiceBehavior Members 

    public void AddBindingParameters(ServiceDescription serviceDescription, 
     System.ServiceModel.ServiceHostBase serviceHostBase, 
     System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, 
     System.ServiceModel.Channels.BindingParameterCollection bindingParameters) 
    { 

    } 

    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase) 
    { 

    } 

    public void Validate(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase) 
    { 

    } 

    #endregion 

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

    protected override object CreateBehavior() 
    { 
     return new HmacVerificationBehavior(); 
    } 
} 

Ahora, para utilizar el inspector, añada lo siguiente a su web.config (se puede establecer el nombre para su extensión a lo que usted quiere)

<system.serviceModel> 
     <extensions> 
      <behaviorExtensions> 
       <add name="hmacVerification" type="NamespaceHere.HmacVerificationConfigurationSection, AssembleyHere, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
      </behaviorExtensions> 
     </extensions> 
     <services> 
      <service name="MySecureService"> 
       <endpoint address="" binding="webHttpBinding" contract="IMySecureService" behaviorConfiguration="web" /> 
      </service> 
     </services> 
     <behaviors> 
      <endpointBehaviors> 
       <behavior name="web"> 
        <webHttp automaticFormatSelectionEnabled="true" />   
        <hmacVerification /> 
       </behavior> 
      </endpointBehaviors> 
      <serviceBehaviors> 
       <behavior name=""> 
        <serviceMetadata httpGetEnabled="true" /> 
        <serviceDebug includeExceptionDetailInFaults="false" /> 
       </behavior> 
      </serviceBehaviors> 
     </behaviors> 
     <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" /> 
    </system.serviceModel> 

Un par de cosas, primero registra la sección de configuración en las extensiones de comportamiento. A continuación, usa esa configuración como un comportamiento de punto final que luego inyectará automáticamente el inspector y todas las solicitudes a ese punto final se ejecutarán a través de su inspector. Si desea desactivar el inspector, elimine la etiqueta o seleccione un comportamiento de punto final diferente. Tenga en cuenta el uso del comportamiento webHttp también (que le permitirá mantener automaticFormatSelectionEnabled).

Espero que esto ayude

+0

Ya sabes, creo que esto podría estar desactualizado. – control

+0

Por el contrario, creo que es de mucha ayuda. Gracias. – Barun

+0

Mejor publicación sobre el mensaje de wcf que he leído en mucho tiempo. Muchas gracias. –

Cuestiones relacionadas