WCF 및 Unity와의 차단을 사용하는 방법
-
03-07-2019 - |
문제
Unity 컨테이너 내에서 호스팅 할 WCF 서비스가 있습니다. 이 컨테이너를 사용하여 방법 차단을 수행하려고했습니다. 문제는 인터셉터를 발사 할 수 없다는 것입니다 ...
먼저 여기에서 내 인터셉터 속성 및 처리기의 정의 :
[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;
}
}
여기서 내가 뭘 잘못하고 있니?
해결책
WCF 동작을 사용하여 체크 아웃 할 수 있습니다. 유용한 링크가 있습니다.
http://msdn.microsoft.com/en-us/magazine/cc136759.aspx
그리고
http://www.global-webnet.net/blogengine/post/2009/01/03/integrating-iis-wcf-and-unity.aspx
-Bryan
다른 팁
나는 당신이 찾고있는 일을 정확히하는 것을 만들었습니다. CodePlex에 배치했습니다.
http://wcfaop.codeplex.com/
기본적으로 자신만의 인스턴스 제공자를 만들어 유니티 컨테이너에서 WCF 서비스 객체를 만들고 가로 채기를 할 수 있습니다.
제휴하지 않습니다 StackOverflow