2013-01-09 14 views
22

Sto lavorando a un'applicazione Web ASP.NET MVC3 (non scritta da me) che ha una dimensione massima di caricamento di 100 MB. Ora questa applicazione web viene installata su macchine server per i clienti, quindi sarebbe bello se questa dimensione massima di caricamento del valore fosse configurabile per ciascun cliente. Hanno accesso a modificare il web.config per l'applicazione Web, se necessario.Come leggere il valore di sistema da web.config e utilizzarlo nel metodo ASP.NET MVC C#

Ora c'è un valore nel web.config in questo modo:

<system.webServer> 
    <security> 
     <requestFiltering> 
      <requestLimits maxAllowedContentLength="104857600" /> 
     </requestFiltering> 
    </security> 
</system.webServer> 

Inoltre c'è un altro valore qui che sembra essere simile:

<system.web> 
    <httpRuntime maxRequestLength="104857600" executionTimeout="360" /> 
</system.web> 

Che 104857600 byte sembra essere il file di 100 MB limite di upload Tuttavia, cambiando il valore, ho scoperto che questo non è il valore autorevole e non stava rispettando il nuovo limite. Quindi dopo un po 'di ricerche ho trovato da qualche altra parte nel codice C# un valore codificato public const double MaxContentSize = 104857600 e un altro metodo C# stava usando quel valore per accettare/negare il caricamento del file Ajax.

Quindi quello che penso che mi piacerebbe fare è sostituire il codice codificato nel codice in modo che legga il valore nel web.config. Quindi almeno chiunque può modificare quel valore in web.config quando distribuiscono il sito web.

Puoi fare qualcosa del genere?

MaxContentSize = ConfigurationManager.systemWeb.httpRuntime['maxRequestLength']; 

Ho visto alcuni esempi utilizzando appSettings nel web.config, ad es.

<appSettings><add key="MySetting" value="104857600" /></appSettings> 

poi accedervi come:

ConfigurationManager.AppSettings["MySetting"] 

Ma questo significherebbe l'aggiunta di un valore personalizzato in là e ora avremmo 3 posti per cambiare nel web.config. Qualcuno ha un'idea su come farlo correttamente?

Molte grazie

risposta

29

Si può fare qualcosa di simile:

int maxRequestLength = 0; 
HttpRuntimeSection section = 
ConfigurationManager.GetSection("system.web/httpRuntime") as HttpRuntimeSection; 
if (section != null) 
    maxRequestLength = section.MaxRequestLength; 
+3

di ringraziamento questo funziona! Richiede due namespace: 'using System.Configuration;' e 'using System.Web.Configuration;'. Ho accettato la tua risposta in quanto ha la gestione degli errori se la sezione httpRuntime non esiste ricade su un valore predefinito che è bello. Ho provato a rimuovere l'intera sezione '' da Web.config e il caricamento del file fallisce completamente da qualche parte prima che possa arrivare a questo codice, quindi suppongo che sia assolutamente necessario. Quindi, se mi liberassi del codice del valore predefinito, questo lo porterebbe a 2 righe, bello. – zuallauz

7

Prova:

var config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("/") 
var section = (System.Web.Configuration.SystemWebSectionGroup)config.GetSectionGroup("system.web") 
var maxRequestLength = section.HttpRuntime.MaxRequestLength 
+0

Grazie, questo funziona! – zuallauz

8

Non sembra esserci un modo semplice per leggere la sezione system.webServer, perché è contrassegnato come "ignorato" da machine.config.

Un modo è quello di analizzare il codice XML del file web.config direttamente:

var config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath); 
var section = config.GetSection("system.webServer"); 
var xml = section.SectionInformation.GetRawXml(); 
var doc = XDocument.Parse(xml); 
var element = doc.Root.Element("security").Element("requestFiltering").Element("requestLimits"); 
string value = element.Attribute("maxAllowedContentLength").Value; 
+0

Grazie! Ciò sarà utile se ho bisogno di accedere alla sezione system.webServer in futuro. Sono riuscito a farlo funzionare solo con l'attributo 'MaxRequestLength'. Il 'maxAllowedContentLength' nel sistema.webServer/security/requestFiltering/requestsLimits sembra essere sovrascritto dall'attributo 'MaxRequestLength' in system.web/httpRuntime. – zuallauz

+0

Non sembrano essere sovrascritti nei miei test. Devo impostare entrambi i valori. – Rhyous

Problemi correlati