Ken*_*nic 7 .net multithreading
我已经在调用context(CallContext.SetData(key,data))上放置了一些数据,其中data是一种实现的类型ILogicalThreadAffinative.它实现ILogicalThreadAffinative的原因是它必须在当前应用程序中的多个线程之间共享.
但是,该应用程序还会对另一个服务进行远程调用,这就是问题所在.我的ILogicalThreadAffinative实现不可序列化,不应该.即使我将其标记为可序列化,远程应用程序也无法访问声明类型的程序集,因此无法对其进行反序列化.
那么如何在我的应用程序(AppDomain)中共享呼叫上下文数据,而不是与它碰巧需要与之交谈的每个外部应用程序共享?
最后,我通过实现一个自定义IMessageSink解决了这个问题,我在插入远程调用的客户端格式化器之前插入了该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;
}
Run Code Online (Sandbox Code Playgroud)
我不是特别喜欢这个解决方案.它似乎不仅仅是一点点hackish,但它是我能够提出的最好的解决方案.
| 归档时间: |
|
| 查看次数: |
2426 次 |
| 最近记录: |