同一 AppPool 中不同应用程序之间可以共享变量吗?

3
我正在使用Asp.net FW 4.6。
我有两个应用程序在同一个应用程序池下,需要不断地读取一个预定义值,该值是可变的对象。
由于不同的应用程序(即使在同一个应用程序池下)不会共享,因此无法使用静态变量。
DB /文件/服务器是已知的选项。
但是:
问题:
是否有任何代码可以编写,可以存储在内存中的值,这些值可以通过处于同一应用程序池下的多个应用程序访问?
类似于:
MyAppPool  

    App1   -> func("royi") = 1
    App2   -> var a= func2("royi"); //1
1个回答

1

所有的进程间通信方式,例如内存映射文件命名管道,也可以用于在单个AppPool中跨应用程序共享数据,例如在两个应用程序之间共享内存

由于同一AppPool中的所有应用程序都驻留在同一进程中,仅由AppDomain边界分隔,您还有一些额外的选项:

请使用 MarshalByRefObject 来跨越 AppDomain 访问对象实例。已经有可用的封装器使用 MarshalByRefObject 实现跨应用程序域单例,例如 Stephen ClearyCrossDomainSingleton 或者这个。使用指针和 unsafe 代码来直接访问由 Marshal.AllocHGlobal 分配的内存,特别是当速度是您关心的问题时。但是,您必须使用上述方法之一来共享已分配内存的内存地址。

你提到的MarshalByRefObject实现是针对具有多个应用程序域的应用程序,而不是同一应用程序池中的不同应用程序。我花了几个小时尝试使其工作,但从未看到其他AppDomains。 - achecopar
@achecopar IIS 使用 AppDomains 来将单个应用程序(在 AppPool 中)相互隔离。至少这是几年前 IIS 7.5 的工作方式,当时我成功地使用了 技术来枚举属于其他应用程序的 AppDomains,并使用 MarshalByRefObject 在这些 AppDomains 之间进行通信。但自那以后可能已经发生了变化。 - Ňuf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接