2009-03-03 7 views
1

J'ai un service WCF configuré pour être hébergé dans un conteneur Unity. J'avais l'intention d'utiliser ce conteneur pour effectuer une interception de méthode. Le problème est que je ne peux pas obtenir mon intercepteur au feu ...Comment utiliser l'interception avec WCF et Unity

d'abord ici la définition de mon attribut intercepteur et gestionnaire:

[AttributeUsage(AttributeTargets.Method)] 
public class PCSecurityAttribute : HandlerAttribute 
{ 
    public PCSecurityAttribute(Modules module, int modulePermission) 
    { 
     SecurityModule = module; 
     SecurityModulePermission = modulePermission; 
    } 

    public Modules SecurityModule 
    { 
     get; 
     set; 
    } 

    public int SecurityModulePermission 
    { 
     get; 
     set; 
    } 

    public override ICallHandler CreateHandler(IUnityContainer container) 
    { 
     return new PCSecurityCallHandler(0, SecurityModule, 
      SecurityModulePermission); 
    } 
} 

using System.ServiceModel.Security; 
using MHC.PracticeConnect.Contract.Data.Security; 
using Microsoft.Practices.Unity.InterceptionExtension; 

namespace MHC.PracticeConnect.Service 
{ 
    public class PCSecurityCallHandler : ICallHandler 
    { 
     private Modules securityModule; 
     private int securityModulePermission; 

     public PCSecurityCallHandler(Modules module, int modulePermission) 
     { 
      securityModule = module; 
      securityModulePermission = modulePermission; 
      Order = 0; 
     } 

     public PCSecurityCallHandler(int order, Modules module, 
      int modulePermission) 
     { 
      securityModule = module; 
      securityModulePermission = modulePermission; 
      Order = order; 
     } 

     public IMethodReturn Invoke(IMethodInvocation input, 
      GetNextHandlerDelegate getNext) 
     { 
      bool validPermission = false; 
      // check security permission 

      IMethodReturn result; 

      if (validPermission) 
       result = getNext().Invoke(input, getNext); 
      else 
       throw new SecurityAccessDeniedException(
        "The current user does not have security " + 
        "permissions to call this module."); 

      return result; 
     } 

     public int Order 
     { 
      get; 
      set; 
     } 
    } 
} 

Dans mon hôte, j'ai essayé de le configurer pour utiliser interception pas avail ... AIDE !!!!

public class DocumentTemplateServiceHostFactory : ServiceHostFactory 
{ 
    protected override ServiceHost CreateServiceHost(Type serviceType, 
     Uri[] baseAddresses) 
    { 
     UnityServiceHost host = 
      new UnityServiceHost(serviceType, baseAddresses); 
     UnityContainer unity = new UnityContainer(); 
     host.Container = unity; 
     host.Container.AddNewExtension<Interception>(); ; 
     host.Container.RegisterType<IDocumentTemplateService, 
      DocumentTemplateService>().Configure<Interception>(). 
     SetInterceptorFor<IDocumentTemplateService>(
      new TransparentProxyInterceptor()); 

     return host; 
    } 
} 

Qu'est-ce que je fais mal ici?

+0

Je ne peux vraiment pas comprendre pourquoi votre code ne fonctionne pas. l'avez-vous découvert? – Attilah

Répondre

0

J'ai créé quelque chose qui fait exactement ce que vous cherchez. Je l'ai placé sur CodePlex:
http://wcfaop.codeplex.com/

Fondamentalement, vous devez créer votre propre InstanceProvider qui sera ensuite créer l'objet de service WCF d'un conteneur unité et vous permettre de faire l'interception.

Questions connexes