gpt4 book ai didi

c# - Unity 拦截器如何确定调用是来自 WCF 还是来自内部服务?

转载 作者:太空宇宙 更新时间:2023-11-03 12:45:29 24 4
gpt4 key购买 nike

我有一个与 Unity 拦截器 Hook 的 WCF 服务,所有对 WCF 层的调用都被 Unity 拦截以用于审计目的。然而,Unity 似乎拦截了ALL 调用来解析接口(interface),无论调用是来自 WCF 还是内部。

考虑以下代码:

[ServiceContract]
public interface IMyUtilityService
{
[OperationContract]
void DoUtilityStuff();
}

[ServiceContract]
public interface IMyService
{
[OperationContract]
void DoStuff();
}

class MyService : IMyService
{
public MyService(IMyUtilityService myUtilityService)
{
}

public void DoStuff()
{
}
}

服务接口(interface)通过拦截注册到Unity:

container.RegisterType<IMyUtilityService, MyUtilityService>(
new Interceptor<InterfaceInterceptor>(),
new InterceptionBehavior<PipelineInterceptor>());

container.RegisterType<IMyService, MyService>(
new Interceptor<InterfaceInterceptor>(),
new InterceptionBehavior<PipelineInterceptor>());

当对 IMyService 进行 WCF 调用时,我会触发拦截器,这非常好,我可以进行一些审计。然而,当 IMyService 被解析时,拦截器再次触发,因为 IMyUtilityService 被注入(inject)到 IMyService 构造函数中。

有没有办法配置 Unity 来防止这种情况发生?或者拦截器内部有没有办法判断拦截是WCF直接触发的?还是我需要创建一个不同的接口(interface)层来分离外部调用和内部调用?

最佳答案

我设法解决了在 Unity 中创造性地注册服务的问题。以前,服务在 Unity 中注册为仅内部服务或具有拦截功能的 WCF 服务。如果随后在内部使用 WCF 服务,拦截器就会出现问题。

注意:拦截器的问题可能是因为我们使用了 Lazy resolution of dependencies。

可以通过将所有服务注册到 Unity 进行内部解析,然后使用显式名称注册 WCF 服务来解决该问题。当激活 WCF 端点时,可以使用显式名称解析实例。

例如,注册服务:

container.RegisterType(interfaceType, implementationType);

if (isWCF)
container.RegisterType(
interfaceType,
implementationType,
"WCF", // name for resolving WCF services
new Interceptor<InterfaceInterceptor>(),
new InterceptionBehaviour<PipelineInterceptor>());

然后在 Instance Provider 中创建实例:

public object GetInstance(InstanceContext instanceContext, Message message)
{
return _container.Resolve(_interfaceType, "WCF");
}

解决方案是首选,因为拦截器现在仅在调用 WCF 服务时注册和激活。

关于c# - Unity 拦截器如何确定调用是来自 WCF 还是来自内部服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37472638/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com