Wie man Abfangen mit WCF und Einheit verwendet
-
03-07-2019 - |
Frage
Ich habe einen WCF -Dienst, der in einem Unity -Container eingerichtet wird. Ich hatte beabsichtigt, diesen Container zu verwenden, um Methodenabhörungen durchzuführen. Das Problem ist, dass ich meinen Abfangfeuerer nicht zum Feuer bringen kann ...
Zuerst hier die Definition meines Interceptor -Attributs und -handlers:
[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;
}
}
}
In meinem Host habe ich versucht, es so zu konfigurieren, dass Abfangen ohne Erfolg verwendet werden ... Hilfe !!!!
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;
}
}
Was mache ich hier falsch?
Lösung
Möglicherweise möchten Sie sich mit WCF -Verhaltensweisen ansehen. Hier sind Links, die nützlich sein könnten.
http://msdn.microsoft.com/en-us/magazine/cc136759.aspx
UND
http://www.global-webnet.net/blogengine/post/2009/01/03/integrating-iis-wcf-and-unity.aspx
-Rryan
Andere Tipps
Ich habe etwas geschaffen, das genau das tut, wonach Sie suchen. Ich habe es auf Codeplex platziert:
http://wcfaop.codeplex.com/
Grundsätzlich müssen Sie Ihren eigenen Instanzprovider erstellen, der dann das WCF -Dienstobjekt aus einem Unity -Container erstellt und Ihnen das Abfangen ermöglichen.