2016-05-26 4 views
1

私はASP.NETアプリケーションで作業しており、一部の要求中に顧客スクリプトを呼び出す機能を追加したいと考えています。このスクリプトは信頼できないため、IIS要求内に子AppDomainを作成しています。この要求には、アクセス許可が限定されており、顧客アセンブリとスクリプトランナーアセンブリの両方が読み込まれています。特定の基準が満たされている場合、顧客スクリプトはビジネスオブジェクトの説明を変更するか、ステータスコードをエラーに変更するなどの作業を行うことができます。変更は非常に多様であるため、メソッド呼び出しから返される単一のオブジェクトに変更を含めることはできません。スクリプトが実行されているので、この子を起動したリクエスト内のオブジェクトの値を変更する必要があります。IIS要求内のAppDomains間の双方向通信

このpostは、NetNamedPipeBindingを使用することを推奨していますが、複数のリクエストを同時に実行できるIIS内で動作するコードには適していないと懸念しています。 IISリクエストごとに新しいホストを設定できますか?プロセス全体に静的ホストを設定し、エンドポイントを使用して、正しい子が正しい要求と通話することを確認しますか?これは正しい技術ですか?

これは適切な技術ではない場合、それは何ですか?このpostは、親AppDomainのハンドルを取得する方法を説明していますが、それらの多くはmscoree.dllを使用しているようですが、一般にCOMとIISはあまりうまく混ざらないという印象を受けました。 This postは、最初のAppDomainを消去して新しいAppDomainを作成する方法について話します。おそらく、それはIISでは必要ないでしょうか?

子AppDomainが、それを生成したRequestオブジェクト内のメソッドを効率的に実行する方法はありますか?

答えて

2

私は、WCFかにmscoree.dllを使用せずに親のAppDomainの状態を変更する子のAppDomainのための簡単な方法を見つけたと思います。上記の最初のポストを読み返して、私は彼がそれを可能性として言及しているのを見ますが、私には分からない理由でそれを拒否します。トリックは、親にMarshalByRefObjectをから派生したオブジェクトを作成し、それにObjectHandleを取得し、その後、子アプリケーションドメインにそのObjectHandleを通過させることです。次に、子はハンドルをラップしてプロキシを取得し、親のオブジェクトの状態を変更するメソッドを呼び出すことができます。コードサンプルは次のとおりです。

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); 
    } 
} 

このコードは、子のメソッドが親のオブジェクトの状態を変更できることを示しています。この特定の例はそれほど有用ではありませんが、サンドボックスを設定し、信頼できない子アセンブリに.dllを含めると非常に強力です。信頼できないアセンブリは、ChildFacade内のメソッドを呼び出すことができるため、親の状態を制御された安全な方法で変更できます。

関連する問題