2009-08-19 9 views
6

Vorrei gestire le richieste in modo diverso a seconda del tipo MIME. Ad esempio, ho PDF, immagini e altri file multimediali che vorrei vietare l'accesso in base ai loro rispettivi tipi MIME. Qualche idea su come fare questo? Grazie per l'aiuto.Come si ottiene il tipo MIME di un file richiesto in ASP.NET C#?

Devo anche notare che l'accesso al registro di Windows non è un'opzione per la mia applicazione.

+0

È questo in relazione alle restrizioni Carica di questi file o scaricare –

+0

Questo è rispetto a scaricare e/o la riscrittura degli URL. – mkelley33

risposta

10

mime-type mappature del NET sono memorizzati nella classe che offre System.Web.MimeMapping il metodo GetMimeMapping.

Prima di .NET 4.5, questa classe era contrassegnata come internal e quindi non disponibile per il codice. In tal caso, il meglio che puoi fare è rubare la lista, che puoi usare usando Reflector e decompilare il costruttore statico (cctor).

Se si sta adottando questo approccio, potrebbe essere meglio semplicemente creare un elenco di estensioni supportate e il loro tipo di mimo e memorizzarlo su un dizionario. (L'elenco all'interno MimeMapping è un po 'verboso)

+0

Questo è esattamente il percorso che ho seguito. Sono sicuro che mi mancano alcune estensioni, ma molto probabilmente sarebbero i casi d'angolo meglio affrontati in quanto si presentano per soddisfare il requisito di "essere produttivi/operativi del software" LOL. Grazie per il suggerimento! Non ho mai saputo di MimeMappings. Molto bello! – mkelley33

+2

A partire da 4.5, questa classe è diventata pubblica! Con il pratico metodo 'GetMimeMapping (string fileName)'. - http://msdn.microsoft.com/en-us/library/system.web.mimemapping.getmimemapping.aspx – Snixtor

0

Se sto capendo correttamente la tua domanda, stai servendo file statici e vuoi essere in grado di eseguire l'elaborazione su una richiesta di file statico per decidere se l'utente ha o meno accesso a quel file. (in base al tipo MIME)

Se si esegue il mapping di tutte le richieste di file tramite un IHttpHandler personalizzato (consultare la sezione relativa ai gestori del file web.config), si dovrebbe riuscire a farlo.

In ProcessRequest (o BeginProcessRequest se si implementa un gestore asincrono), è possibile chiamare HttpContext.Current.Server.MapPath ("~" + HttpContext.Current.Request.Path) (potrebbe essere un modo migliore per farlo) per ottenere il file statico corrente richiesto.

È quindi possibile analizzare l'estensione di tale file per prendere una decisione.

Non sono sicuro se questo è ciò che si vuole, ma si spera che aiuta

+0

Questo è molto vicino a quello che voglio, ma speravo che ci fosse un modo più automatico di farlo, piuttosto che analizzare l'estensione. Qualcosa di più sulla falsariga di Request.MIMEType. Grazie per il tuo contributo! – mkelley33

1

Queste informazioni sono nel Registro di sistema, in HKEY_CLASSES_ROOT\<file_extension>\Content Type

using(var key = Registry.ClassesRoot.OpenSubKey(".htm")) 
{ 
    string mimeType = key.GetValue("Content Type") as string; 
} 
+1

Grazie per l'input, ma i requisiti tecnici che mi sono stati imposti non richiedono l'accesso al registro. – mkelley33

9

Ho avuto un problema simile qualche mese fa e risolto con questo semplice wrapper di classe intorno System.Web.MimeMapping (come detto da Richard Szalay):

/// <summary> 
/// This class allows access to the internal MimeMapping-Class in System.Web 
/// </summary> 
class MimeMappingWrapper 
{ 
    static MethodInfo getMimeMappingMethod; 

    static MimeMappingWrapper() { 
     // dirty trick - Assembly.LoadWIthPartialName has been deprecated 
     Assembly ass = Assembly.LoadWithPartialName("System.Web"); 
     Type t = ass.GetType("System.Web.MimeMapping"); 

     getMimeMappingMethod = t.GetMethod("GetMimeMapping", BindingFlags.Static | BindingFlags.NonPublic); 
    } 

    /// <summary> 
    /// Returns a MIME type depending on the passed files extension 
    /// </summary> 
    /// <param name="fileName">File to get a MIME type for</param> 
    /// <returns>MIME type according to the files extension</returns> 
    public static string GetMimeMapping(string fileName) { 
     return (string)getMimeMappingMethod.Invoke(null, new[] { fileName }); 
    } 
} 
+1

Qualche problema con l'evitamento dell'hack sporco facendo riferimento a un tipo pubblico? 'Assembly.GetAssembly (typeof (System.Web.HttpApplication))'. Finché il metodo e il tipo di riferimento non cambiano o spariscono, cioè ...? –

+6

Mi piace il nome della variabile per Assembly. –

8

cross-posting da Why would Reflection search suddenly not find anything?

la buona notizia è che la classe MimeMapping e il suo metodo GetMimeMapping sembrano come potrebbero essere resi pubblici in .NET 4.5.

Tuttavia, ciò significa che il codice indicato nel above answer si interromperà, poiché è solo la ricerca di GetMimeMapping tra i metodi NonPublic.

Per garantire la compatibilità con .NET 4.5 (ma conservare la funzionalità in .NET 4.0 e precedenti), il cambiamento ...

getMimeMappingMethod = t.GetMethod("GetMimeMapping", 
    BindingFlags.Static | BindingFlags.NonPublic); 

... a:

getMimeMappingMethod = t.GetMethod("GetMimeMapping", 
    BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public); 
+0

carino ... anche se non capisco. Sono ancora su .NET 4 eppure il framework sembra comportarsi come tu hai descritto (che è come in .NET 4.5) .. molto strano – mare

+1

@mare potresti avere installato .NET 4.5 - è un aggiornamento sul posto in modo che gli assembly avranno il nuovo codice in fase di esecuzione ma VS si limita a compilare il codice disponibile per .NET 4.0. –

Problemi correlati