2009-03-03 57 views
1

我有一个WCF服务设置为在一个容器中托管。我打算使用这个容器来执行方法拦截。问题是我不能让我的拦截射击......如何使用WCF和Unity拦截

首先我在这里的拦截器的属性和处理程序的定义:

[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; 
     } 
    } 
} 

在我的主人,我试图将其配置为使用拦截不利用...帮助!

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; 
    } 
} 

我在这里做错了什么?

+0

我真的不明白为什么你的代码不起作用。你发现了吗? – Attilah 2011-11-01 16:18:45

回答

0

我已经创建了一个不正是你要寻找的东西。我已经把它在CodePlex上:
http://wcfaop.codeplex.com/

基本上,你必须创建自己的InstanceProvider那么这将创建一个从统一容器WCF服务对象,并允许你做拦截。