【问题标题】:Shared variable across applications within the same AppPool?同一个 AppPool 中的应用程序之间的共享变量?
【发布时间】:2018-03-08 13:43:13
【问题描述】:

我正在使用Asp.net FW 4.6。

我在同一个应用程序池下有两个应用程序,它们需要(不断地)读取一个预定义的值,该值是要更改的对象。

不能使用静态变量,因为不同的应用程序(即使在同一个应用程序池下) - 不会被共享。

DB/File/Server 是已知选项。

但是:

问题:

是否有任何我可以编写的代码可以存储在 mem 值中,这些代码可以通过同一个 App Pool 下的多个应用程序访问?

类似:

MyAppPool  

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

【问题讨论】:

    标签: c# asp.net application-pool


    【解决方案1】:

    所有进程间通信方式,例如Memory Mapped FilesNamed Pipes,也可用于在单个AppPool 中跨应用程序共享数据,例如Sharing memory between two applications

    因为同一个 AppPool 中的所有应用程序都驻留在同一个进程中,并且仅由 AppDomain 边界分隔,所以您还有一些额外的选择:

    • 使用 MarshalByRefObject 跨 AppDomain 边界访问对象实例。有 已经可用的使用 MarshalByRefObject 实现的包装器 跨 AppDomain 单例,例如 Stephen Cleary's CrossDomainSingletonthis one
    • 使用指针和unsafe 代码直接访问Marshal.AllocHGlobal 分配的内存,尤其是在您关心速度的情况下。但是您必须使用上述方法之一在应用程序之间共享已分配内存的内存地址。

    【讨论】:

    • 您提到的 MarshalByRefObject 实现适用于具有多个 appDomain 的应用程序,而不适用于同一应用程序池中的不同应用程序。我花了几个小时试图让它工作,但永远看不到其他 AppDomain。
    • @achecopar IIS 使用 AppDomains 将各个应用程序(在 AppPool 内)相互隔离。或者至少它是多年前在 IIS 7.5 上的工作方式,当时我成功使用this 技术枚举属于其他应用程序的 AppDomainsMarshalByRefObject i> 用于这些 AppDomains 之间的通信。但从那以后情况可能发生了变化。
    猜你喜欢
    • 2023-02-20
    • 2012-11-14
    • 1970-01-01
    • 2012-04-05
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    相关资源
    最近更新 更多