Consegna e memorizzazione dei file nella cache in asp.net

3

La domanda è: qual è un modo efficace per consegnare i file agli utenti? Si consideri un'applicazione asp.net che offre la possibilità di visualizzare vari file. Una sorta di libreria di immagini o directory di file web. I punti chiave sono:

  • l'utente può caricare file arbitrari di dimensioni < = 10Mb
  • I file
  • sono memorizzati sul disco
  • I file
  • non cambiano mai
  • l'utente può rimuovere un file
  • c'è una certa procedura di controllo degli accessi per accedere a un file

Quindi dovrei trovare un certo equilibrio tra la disponibilità (cioè il caching) e la sicurezza (ad esempio il controllo dell'accesso).

Attualmente l'utente invia una richiesta in una forma /attachment/{id} , e un controllore legge un file da un disco e lo invia a un client:

if(HasAccess(user)) {
   var data = File.ReadAllBytes()
   return new FileResult(data);
}

Sospetto che non sia un modo ottimale: riguarda la pipeline di applicazioni di asp.net e utilizza molto i dischi. Può essere ottimizzato in questo modo? Posso archiviare questi file nella cache di output?

Ci sono altri modi (non usando Controller) per consegnare file che dovrebbero essere considerati?

    
posta mikalai 28.04.2013 - 14:07
fonte

1 risposta

2

Ho lavorato di recente su un progetto web usando asp.net (MVC3) e abbiamo dovuto implementare due funzionalità tra cui il recupero / archiviazione di file sul / dal server web (file system). Uno era il caricamento e il download di file per lo scambio di file dell'utente e l'altro era il download di file di report (excel, pdf, csv e così via).

Tendo sempre a cercare di utilizzare il framework con cui lavoro fino in fondo, prima di scrivere qualcosa per conto mio, perché credo che sia (fino al 99%) molto ben progettato, creato, ottimizzato e testato per risolvere problemi specifici e reali.

Detto questo, non hai comunque molte altre opzioni, secondo me. Perché dovresti usare ASP.NET e poi cercare di evitare il controller? L'intero concetto di sicurezza integrata sarà rotto. Inoltre, non dimenticare la registrazione, ignorando OnActionExecuting ti dà un sacco di energia.

Per il nostro progetto abbiamo creato attributi personalizzati (personalizzando il contesto di sicurezza dei framework) per decorare i metodi del controller direttamente in questo modo:

[UserHasAccess(Roles.Download)]
public Attachment(int id)
{ 
    //... 
}

e quindi ha salvato la parte if nel codice, che lo rende più pulito e leggibile. Inoltre, perché dovresti evitare la convenzione URI pulita (percorsi asp.net) link e utilizzare qualcosa di più illeggibile come link ?

Abbiamo usato anche FileResult per consegnare i file con i diversi tipi di mime e fino ad oggi non abbiamo mai avuto problemi.

Informazioni sulla memorizzazione nella cache - Penso che non abbia senso memorizzare nella cache i file dal file system, a meno che tu non sia esattamente quello che i 25 migliori file saranno scaricati di più. Allora sì, potresti metterli nella cache. Nel nostro caso l'accesso a FS si è dimostrato accettabile, quindi non memorizziamo i file nella cache.

Risposta del commento

Ciao. A mio parere, tutti gli articoli sulle best practice riguardano le informazioni oi dati che di solito sono generati dinamicamente o appartengono al sito ed è improbabile che cambino (come i pulsanti di navigazione, ad esempio) e non ai file memorizzati in FS per esempio .

Nel nostro progetto usiamo il caching per gli elenchi che mostriamo (che possono contenere centinaia di elementi contenenti informazioni, ma non dati binari!) e le pagine (ogni pagina mostra una parte predefinita della lista). Non memorizziamo i file nella cache da FS!

Nel vostro caso d'uso si ha il punto di utente può caricare i file arbitrari questo potrebbe significare 1000 file ogni giorno. Li metteresti tutti in cache? 1000 file x 5 MB (in media) ~ = ca. 5 GB. Quanta memoria ha il tuo server web? Con quale frequenza ricaricherai la cache? Refreshing significa di nuovo leggere ...

Si potrebbe memorizzare nella cache il più recente 100 e se l'utente che scarica il file è fortunato abbastanza da scaricare esattamente uno dei file memorizzati nella cache, allora si avrà risparmiare un po 'di tempo e file di sistema di accesso. In generale e statisticamente (se lo scambio di file è molto usato) probabilmente no!

Fai la matematica su carta e guardala da sola se ne vale la pena, per memorizzare i file o meno.

Spero che questo chiarisca la mia precedente risposta. Ci scusiamo per aver portato gli attributi e così, è stato lo sfondo per l'utilizzo del framework.

Cordiali saluti, P.

    
risposta data 28.04.2013 - 23:27
fonte

Leggi altre domande sui tag