Question

J'ai un service WCF configuré pour être hébergé dans un conteneur d'unité. J'avais l'intention d'utiliser ce conteneur pour effectuer une interception de méthode. Le problème est que je ne parviens pas à faire tirer mon intercepteur ...

Tout d'abord, voici la définition de mon attribut d'intercepteur et de mon 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 l'interception, mais en vain ... HELP !!!!

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?

Était-ce utile?

La solution

Vous pouvez vouloir utiliser des comportements WCF. Voici des liens qui pourraient être utiles.

http://msdn.microsoft.com/en-us/magazine /cc136759.aspx

ET

http : //www.global-webnet.net/blogengine/post/2009/01/03/Integrating-IIS-WCF-and-Unity.aspx

-Bryan

Autres conseils

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

En gros, vous devez créer votre propre InstanceProvider qui créera ensuite l'objet de service WCF à partir d'un conteneur Unity et vous autorisera à effectuer une interception.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top