问题标签 [unity-interception]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - Unity 拦截器如何确定调用是来自 WCF 还是来自内部服务?
我有一个与 Unity 拦截器挂钩的 WCF 服务,并且出于审计目的,对 WCF 层的所有调用都被 Unity 拦截。但是,Unity 似乎拦截了所有调用来解析接口,无论调用来自 WCF 还是内部。
考虑以下代码:
服务接口注册到 Unity 并进行拦截:
当对 IMyService 进行 WCF 调用时,我会触发拦截器,这很棒,我可以进行一些审核。但是,当 IMyService 被解析时,拦截器会再次触发,因为 IMyUtilityService 被注入到 IMyService 构造函数中。
有没有办法配置 Unity 来防止这种情况?或者拦截器内部有没有办法确定拦截是由WCF直接触发的?还是我需要创建一个不同的接口层来分离外部调用和内部调用?
c# - 从统一拦截调用基方法
我正在尝试使用 VirtualMethodInterceptor 通过 Unity Interception 将瞬态故障处理应用程序块集成到我的应用程序中。
我创建了一个调用处理程序来创建被拦截方法的操作或函数或任务,并将其传递给瞬态故障处理程序,但现在我得到了一个 stackoverflow 异常。这是有道理的,因为故障处理程序将调用统一将拦截并传递给故障处理程序的方法。
我需要的是能够在故障处理程序回调或直接调用基本方法时跳过拦截。一些统一如何能够做到这一点,因为它最终会调用我的类方法。
我的拦截代码
我的属性
c# - Unity 拦截无法按预期工作
我使用 unity 作为我的 aop 框架,但它没有按预期工作。请在下面检查我的代码。
当 container.Resolve() 和 ((IAnimal)person) 运行时,行为也被执行,并打印出来
调用方法 System.Type GetType() 开始
调用方法 System.Type GetType() end
我希望日志仅在我显式调用方法时执行。如何预防?
c# - 使用 Unity DI/IoC 拦截接口类型的 IEnumerable 列表
对所有可以提供帮助的人,
我是 Unity 容器的新手,我正在着手通过使用拦截来过滤包含特定接口的集合。拦截的应用对我来说是新的,即使我有使用 AutoFac 和 Castle 的经验。但是,我知道可以做到,但我很难理解为什么我的拦截器不会开火。
本质上,目标是根据登录用户的安全级别过滤对象集合。该接口已命名为ISecurable,它要求其实现者具有MinSecurityLevel属性。不幸的是,大部分代码库都不是针对接口编程的,所以这个接口是新的。由于这个事实,有几个集合将使用这个接口的实现者,即
Orders 和 Customers 实现ISecurable的地方。
因此,与其查找包含实现ISecurable的对象的每个集合,并根据登录用户的安全级别过滤这些集合(这将成为一个难以维护的怪物,并且让用户的登录安全级别变得令人讨厌)。我认为拦截任何包含ISecurable对象的集合都是一种简单、优雅的方式来满足这一要求,同时将该代码选项卡式放置在一个中心位置。
在这样做的过程中,我搜索了互联网上的文章和示例代码,以获得开始拦截的基线。不幸的是,没有任何事情被证明是富有成效的。
看来我和这里的海报在同一条船上:Unity Interception - Custom Interception Behavior
不幸的是,我不知道他/她如何能够连接 CallHandler 和/或 InterceptionBehavior 实现者来开始过滤他们的集合(另外,他们的代码库是针对接口编程的,即 IList,我的代码库依赖于具体类型的 Array和列表)。
这是我尝试过的代码的一些版本(没有锁定触发 Handler 或 InterceptionBehavior 类的任何属性或方法):
我已经尝试过使用和不使用 SecurityHandler 的代码,我得到了相同的结果 - 没有拦截触发。
感谢所有这些帮助!
以下是我迄今为止使用的参考资料:
https://msdn.microsoft.com/en-us/library/ff660851(v=pandp.20).aspx#interception_behavior_custom
PS 由于我缺乏声誉,我无法发布超过 2 个我引用的链接。对不起 :(
编辑
如果我从容器中解析类型,我可以让我的拦截器触发。
就像测试一样,这有效:
aop - 使用面向方面编程时的自定义参数记录
我见过的所有示例都使用面向方面的编程来记录类、方法名称和持续时间,如果它们记录参数和返回值,它们只需使用 ToString()。我需要更好地控制记录的内容。例如,我想跳过密码,或者在某些情况下记录对象的所有属性,但在其他情况下只记录 id 属性。有什么建议么?我查看了 Java 中的 AspectJ 和 C# 中的 Unity 拦截,但找不到解决方案。
c# - .NET Unity 使用自定义属性拦截
我想在这里得到答案中描述的行为,但通过代码使用配置。代码示例显示了在没有任何统一相关的情况下创建自定义属性并通过配置添加行为。
自定义属性位于同一解决方案中引用的单独程序集中。
问题是它在配置过程中抛出异常:
InvalidOperationException:Microsoft.Practices.Unity.InterceptionExtension.CustomAttributeMatchingRule 类型没有采用参数(LogAttribute、Boolean)的构造函数。
将抛出的行更新为:
防止抛出异常,但 LoggingHandler 不接收来自具有 [Log] 属性的方法的任何调用。
注意:标有 [Log] 的方法是公共方法,在不同的程序集中,在使用 .Resolve() 实例化的类中。
c# - 使用接口拦截的约定统一注册
我目前正在尝试使用接口拦截的约定注册。不幸的是,我似乎做错了什么,因为我StackOverflowException
在Unity.Container.dll
第一个解决方案中运行...
这是我尝试过的:
似乎现在所有类都已注册,而不仅仅是具有匹配接口的类(Foo --> IFoo
)。没有接口拦截,语句没问题,我的类也按预期注册了。
任何想法或帮助都会很棒!
更新:
我在另一个问题中发现了这篇文章,该问题说明了何时使用 a LifeTimeManager
orinterception
行为时,所有类型都已注册。通过使用这些信息,以下代码产生了预期的结果:
c# - 如何使用 C# Unity Interception 在调用之间登录
我目前正在使用 Unity Interceptor 来实现日志记录机制,但我无法正确记录信息。
当我调用 MethodA 时,会记录 MethodA 和 MethodB,但我无法判断 MethodB 日志是由 MethodA 还是其他 MethodB 调用引起的。
我的问题是如何实现某种 Id 将它们链接在一起
预期的:
[Id: 001] 方法 A 被调用
[Id: 001] 调用方法 B
[Id: 001] 方法 B 完成
[Id: 001] 方法 A 完成
当前的:
[Id: 001] 方法 A 被调用
[Id: 002] 调用方法 B
[Id: 002] 方法 B 完成
[Id: 001] 方法 A 完成
dependency-injection - 使用统一拦截时 UnityConfig.Resolve 组件失败
我在 .NET MVC 5 应用程序中使用 Unity 解析组件时遇到问题。在我的 App_Start 文件夹中,我生成了 UnityConfig.cs 和 UnityMvcActivator.cs,如下所示:
拦截看起来像这样:
我还自定义了授权过滤器,以下代码在哪里:
问题是 UnityConfig.Resolve 在遵循 SayDoAuthorizeHelper.GetRolesAndCacheThem 方法时无法解析 IUserProvider 组件。(我希望这个类是静态的,因为 IsUserInRole 和 IsUserInRoles 方法也用于剃刀视图。
当我在线上设置断点时 var userProvider = UnityConfig.Container.Resolve(); 然后没有抛出异常,代码仍然继续,但我在局部变量中看到 userProvider 抛出了类型为 'System.IO.FileNotFoundException' Abb.Czopc.SayDo.BusinessLogic.Interface.IUserProvider {System.IO.FileNotFoundException} 的异常消息“无法加载程序集 '15bd37ce9f8a41d9b9916a1ebadc536a'。”。但在输出窗口中,我看到程序集已加载。“iisexpress.exe”(CLR v4.0.30319:/LM/W3SVC/2/ROOT-1-131699797337577440):已加载“15bd37ce9f8a41d9b9916a1ebadc536a”。
当我在没有拦截的情况下在 UnityConfig 中注册时,一切正常。
我也尝试用 VirtualMethodInterceptor 替换 InterfaceInterceptor,但结果相同。任何人都可以帮忙吗?我不知道出了什么问题。感谢帮助。解决方案是用 VS 2015 编写的,nuget 包列表在这里:
c# - VB.net 属性上的属性获取和设置
场景是我们使用 Unity 编写了一个调试器拦截器来轻松包装一个对象,以编写一个方法完成所需的时间间隔。可悲的是,它还编写了所有公共属性的 get 和 set 调用。因此,我们只需在属性上添加一个属性即可将其排除在跟踪之外。就像是:
自从:
不起作用,因为 get 和 set 被编译为它们自己的方法,这些方法将在运行时被拦截。
所以这在 C# 中适用于我们......现在挑战来了,我们也有遗留的 vb.net 应用程序,如果我们有性能问题并且只是想添加这个拦截器来查明我们应用程序中的瓶颈。
可悲的是,我找不到 vb.net 等效于将属性添加到接口中的属性获取和设置方法的方法?或任何其他排除使用 unity.interception 拦截属性调用的方式