C #: sandbox és a teljesítmény (MarshalByRefObject)

szavazat
2

Írtam egy nagyon egyszerű webszerver C #, amely betölti az egyéni modulokat kezelni kéréseket egy adott domain nevet, ahogy azt a konfigurációs fájlban. Az egyedi modulok töltik be egy új AppDomain mert szükség van arra, hogy kirak nekik dinamikusan (jó biztonság is). Mivel így a modulok vannak betöltve egy új AppDomain összes paraméter és visszatérési típusok MarshalByRefObject. Ez jól működik, és átadom a HttpRequest objektum örökli MarshalByRefObject és vissza láncolt lista küldött vissza az ügyfél által a webszerver.

Mindez jól működik, de sok az adat átadásra byte [], és azt hiszem, a proxyt MarshalByRefObject fogja másolni a bájt az új AppDomain a fő AppDomain helyett közvetlen hozzáféréssel. Tehát, ha igazam van ez, ha az egyik modul küldene 5MB fájlt, mint a válasz, akkor 5MB lenne terhelt / keletkezik a modult, majd átmásolja a modulok AppDomain a fő AppDomain és végül küldött a foglalat vissza az ügyfélnek.

Tehát a kérdés az, hogy lehet megkerülni ezt valahogy így nem másolja annyi adatot között AppDomain nál? Vagy van egy jobb módja ennek, hogy nem használja MarshalByRefObject?

A kérdést 12/06/2011 13:28
a forrás felhasználó
Más nyelveken...                            


3 válasz

szavazat
3

Húrok per-folyamat helyett per-appdomain (a teljesítmény miatt). Ha html / xml kerülnek átadásra körül (és nem bináris adat), meg tudná változtatni az API használata húrok helyett byte []. Lehet, hogy még képes legyen támogatni húrok a közös ügy és byte [] a bináris esetben.

Válaszolt 12/06/2011 13:32
a forrás felhasználó

szavazat
2

Így végül halad a SocketInformation az új AppDomain valamint egy új socket tárgy van (az új AppDomain).

Az én „Sandbox átalakító objektum” Én ezt a funkciót:

internal class Sandbox
{
    private AppDomain _AppDomain;
    private WebApplicationProxy _Proxy;

    public Sandbox(string assemblyFile)
    {
        _AppDomain = AppDomain.CreateDomain(Guid.NewGuid().ToString());
        _Proxy = (WebApplicationProxy)_AppDomain.CreateInstanceAndUnwrap(
                                                    Assembly.GetExecutingAssembly().FullName,
                                                    "WebServer.WebApplication.Proxy");
        _Proxy.Initialize(assemblyFile);
    }
    public void SendResponse(Socket client, HttpRequest request)
    {
        SocketInformation clientInfo = client.DuplicateAndClose(Process.GetCurrentProcess().Id);
        _Proxy.GetResponse(clientInfo, request);
    }
}

És az új AppDomain „folytatódik” az aljzatba, nem vagyok biztos benne, hogy valójában mi történik a színfalak mögött ... itt a kód:

internal class Proxy : MarshalByRefObject
{
    private AppController _AppController;

    public void Initialize(string assemblyFile)
    {
        Assembly asm = Assembly.LoadFile(assemblyFile);
        var q = from t in asm.GetTypes()
                where t.GetInterfaces().Contains(typeof(AppController))
                      && !t.IsAbstract && t.IsClass
                select t;
        foreach (Type t in q)
        {
            _AppController = (AppController)Activator.CreateInstance(t);
        }
    }

    public void SendResponse(SocketInformation clientInfo, HttpRequest req)
    {
        Socket client = new Socket(clientInfo);

        LinkedList<byte[]> toSend = _AppController.GetResponse(client, req);

        foreach (byte[] bytes in toSend)
            client.Send(bytes);

        client.Close();
    }
}

Nem vagyok biztos a részleteket, hogy mi történik, ha DuplicateAndClosemeghívjuk, vagy hoz létre, az új Socket objektum az új domain, de jól működik, eddig.

Válaszolt 12/06/2011 21:16
a forrás felhasználó

szavazat
1

Ha ez lenne a .NET 4.0 használatával mappolt fájl lesz lehetőség?

Válaszolt 12/06/2011 21:28
a forrás felhasználó

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more