Comment utiliser l'interception avec WCF et Unity
-
03-07-2019 - |
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?
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.