Pregunta

Tengo un servicio WCF que está configurado para ser alojado dentro de un contenedor unitario. Tenía la intención de utilizar este contenedor para realizar la interceptación de métodos. El problema es que no puedo hacer que mi interceptor se dispare ...

Primero aquí la definición de mi atributo y controlador de interceptor:

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

En mi host, he intentado configurarlo para utilizar la intercepción en vano ... ¡¡¡AYUDA !!!!

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é estoy haciendo mal aquí?

¿Fue útil?

Solución

Es posible que desee revisar utilizando comportamientos WCF. Aquí hay enlaces que pueden ser útiles.

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

Y

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

-Bryan

Otros consejos

He creado algo que hace exactamente lo que estás buscando. Lo he puesto en CodePlex:
http://wcfaop.codeplex.com/

Básicamente, tiene que crear su propio InstanceProvider que luego creará el objeto de servicio WCF desde un contenedor de Unity y le permitirá hacer la intercepción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top