2

我有一个与 Unity 拦截器挂钩的 WCF 服务,并且出于审计目的,对 WCF 层的所有调用都被 Unity 拦截。但是,Unity 似乎拦截了所有调用来解析接口,无论调用来自 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()
    {
    }
}

服务接口注册到 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 被注入到 IMyService 构造函数中。

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

4

2 回答 2

1

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

注意:拦截器的问题可能是因为我们使用了依赖关系的延迟解析。

该问题可以通过向 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 服务进行注册和激活。

于 2016-05-30T04:36:34.330 回答
0

最简单的方法可能是检查您是否有OperationContext

if (OperationContext.Current != null)
{
    // Called through WCF.
}
else
{
    // Not WCF.
}

在拦截器中。

public class PipelineInterceptor : IInterceptionBehavior
{
    public bool WillExecute
    {
        get { return OperationContext.Current != null; }
    }

    // Other ...

}
于 2016-05-27T05:26:46.483 回答