将卷影副本目录添加到ASP.NET AppDomain

时间:2014-08-02 17:59:16

标签: c# asp.net iis appdomain shadow-copy

我已经看到了THISTHIS的问题,但它们都已经存在了几年,而在我的情况下,可能会有另一种解决方案:

我有一个带有基于THIS的插件系统的ASP.NET MVC 5应用程序 所以我的~/bin文件夹是由框架复制的,我的~/Plugins文件夹在应用程序pre-init上使用“手动影子副本”到~/Plugins/ShadowCopy,如上面的链接所示。 /> 到目前为止,这个工作正常,因为我现在有以下情况:

我创建了一个单独的受限AppDomain来执行一些沙盒代码 为了能够将我的程序集中定义的类型的对象传递到此域,我将此域ApplicationBase设置为主域的shadow-copy目录(如果您不从那里加载它们,则会得到{{1}将类型/对象传递给第二个域时,因为定义此类型的程序集是从不同位置加载的。

现在我可以将我的“基本组件”中定义的类型传递给第二个域 但是,只要我想使用插件中定义的类型,这就失败了,因为插件程序集不在默认的卷影副本目录中,而是在我的“手动卷影复制目录”中。
由于此目录也位于完全不同的位置,因此我无法将其添加为SerializationException,因为它们必须位于基本路径下方。

目前我使用以下“解决方法”:

PrivateBinPath
在pre-init方法中

。这会将“手动阴影副本目录”添加到默认的阴影副本dirs中,我的插件也会被框架阴影复制,我的第二个#pragma warning disable 0618 AppDomain.CurrentDomain.SetShadowCopyPath(String.Join(";", HostingEnvironment.MapPath("~/bin"), HostingEnvironment.MapPath("~/Plugins/ShadowCopy"))); #pragma warning restore 0618 能够加载它们,一切都在或多或少地起作用。

但是当AppDomain被谴责时,我现在正在回答我的实际问题:
我正在寻找一种更好的解决方案,以避免使用这种方法。
我想到了以下解决方案,但无法确定是否/如何做到这一点:

  1. 配置IIS以创建SetShadowCopyPathAppDomain属性设置为AppDomainSetup.ShadowCopyDirectories~/bin来自~/Plugins/ShadowCopy
  2. 将影子副本目录移动到例如web.config并告诉IIS不要回复主~/bin/Plugins对此文件夹中的更改(否则应用程序会在每次请求时重新启动,因为pre-init方法每次都会更改其中的文件)
  3. 另一个想法是将“手动影子复制目录”设置在默认的影子副本目录下,而不是像AppDomain这样的~/Plugins/ShadowCopy,但是“干扰框架”是明智的文件夹“?

    我愿意解决这个问题以及解决我的基本问题的不同方法。

0 个答案:

没有答案