我正在使用ASP.NET应用程序,我们希望增加在某些请求期间调用客户脚本的功能。由于我们不信任此脚本,因此我们将在具有有限权限的IIS请求中生成一个子AppDomain,并加载客户程序集和脚本运行程序程序集。如果满足某些条件,客户脚本可以执行诸如更改业务对象的描述或将状态代码更改为错误之类的操作。由于更改是如此多样,因此我无法将它们包含在从方法调用返回的单个对象中。在脚本运行时,我需要它来更改启动此子级的Request内的对象的值。
这篇文章推荐使用NetNamedPipeBinding,但是我越来越担心它不适用于IIS中运行的代码,在IIS中可能同时运行多个请求。我将为每个IIS请求设置一个新主机吗?为整个过程设置一个静态主机,然后使用端点来确保正确的子进程与正确的请求对话?这是正确的技术吗?
如果这不是正确的技术,那是什么?这篇文章告诉您如何检索父AppDomain的句柄,但是其中许多似乎都使用mscoree.dll,通常我的印象是COM和IIS混合得不好。 这篇文章讨论有关清除初始AppDomain并创建一个新AppDomain的问题。也许在IIS中这不是必需的?
子AppDomain是否可以有效地在产生它的Request对象内部执行方法,如果是,那是什么?
我想我已经找到了一种简单的技术,可以使子AppDomain在不使用WCF或mscoree.dll的情况下更改父AppDomain中的状态。重新阅读上面的第一篇文章,我认为他确实提到了这种可能性,但是由于我不清楚的原因而拒绝了它。诀窍是在父级中创建一个从MarshalByRefObject派生的对象,获取一个ObjectHandle,然后将该ObjectHandle传递给子AppDomain。然后,子级可以解开句柄以获取代理,然后可以调用将更改父级中对象状态的方法。这是一个代码示例:
class Program
{
public class ParentFacade : MarshalByRefObject
{
public List<string> Collection { get; set; }
public void AddElement(string el)
{
Collection.Add(el);
}
}
public class ChildFacade : MarshalByRefObject
{
public void AlterParentState(ObjectHandle handle)
{
var parent = handle.Unwrap() as ParentFacade;
parent.AddElement("Message from child");
}
}
static void Main(string[] args)
{
var child = AppDomain.CreateDomain("child");
var childFacadeType = typeof(ChildFacade);
var childProxy = child.CreateInstanceAndUnwrap(childFacadeType.Assembly.FullName, childFacadeType.FullName) as ChildFacade;
var parentColl = new List<string>();
var facade = new ParentFacade();
facade.Collection = parentColl;
var facadeHandle = new ObjectHandle(facade);
childProxy.AlterParentState(facadeHandle);
foreach (var item in parentColl)
Console.WriteLine(item);
}
}
Run Code Online (Sandbox Code Playgroud)
此代码表明,子级中的方法能够更改父级中对象的状态。这个特定的示例并不是非常有用,但是在设置沙箱时非常有用,并且可以在不信任的子程序集中包含.dll。不受信任的程序集可以调用ChildFacade中的方法,从而以受控和安全的方式更改父级中的状态。
归档时间: |
|
查看次数: |
733 次 |
最近记录: |