2009-03-03 55 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服務對象,並允許你做攔截。