gpt4 book ai didi

.net - 如何限制逻辑调用上下文的范围

转载 作者:行者123 更新时间:2023-12-02 04:14:14 25 4
gpt4 key购买 nike

我已在调用上下文 (CallContext.SetData(key,data)) 上放置了一些数据,其中数据的类型实现了 ILogicalThreadAffinative。它实现 ILogicalThreadAffinative 的原因是它必须在当前应用程序中的多个线程之间共享。

但是,应用程序还对另一个服务进行远程调用,这就是问题所在。我的 ILogicalThreadAffinative 实现不可序列化,也不应该序列化。即使我将其标记为可序列化,远程应用程序也无法访问声明该类型的程序集,因此无法反序列化它。

那么,如何在我的应用程序 (AppDomain) 内共享调用上下文数据,而不是与它需要与之通信的每个外部应用程序共享呢?

最佳答案

最终,我通过实现一个自定义 IMessageSink 解决了这个问题,我将其插入到远程调用客户端的格式化程序接收器之前。接收器在调用上下文数据通过线路之前将其删除。下面是相关方法。

private static void SanitizeCallContext(IMessage msg)
{
var callContext = msg.Properties["__CallContext"] as LogicalCallContext;

if (callContext == null) return;

var sanitizedContext = (LogicalCallContext) callContext.Clone();
var prop = typeof (LogicalCallContext).GetProperty("Datastore",
BindingFlags.Instance | BindingFlags.NonPublic);
var dataStore = (Hashtable) prop.GetValue(sanitizedContext, null);
foreach (var key in dataStore.Keys.Cast<string>().ToArray())
sanitizedContext.FreeNamedDataSlot(key);

msg.Properties["__CallContext"] = sanitizedContext;
}

我不太喜欢这个解决方案。这看起来有点黑客,但这是我能想到的最好的解决方案。

关于.net - 如何限制逻辑调用上下文的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4147500/

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