2013-01-09 20 views
22

我正在研究一個最大上傳大小爲100MB的ASP.NET MVC3 Web應用程序(不是我寫的)。現在,這個Web應用程序被安裝在客戶的服務器機器上,所以如果這個值的最大上傳大小可以爲每個客戶配置,那將會很好。如果需要,他們可以訪問編輯Web應用程序的web.config。如何從web.config讀取系統值並在ASP.NET MVC中使用C#方法

現在有像這樣在web.config值:

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

也有這裏的另一個價值這似乎是相似的:

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

那104857600字節似乎是100MB的文件上傳限制。然而,在改變價值時,我發現這不是權威價值,也不是服從新的限制。所以經過一些挖掘之後,我發現C#代碼中的其他地方是一個硬編碼值public const double MaxContentSize = 104857600,另一個C#方法使用該值接受/拒絕Ajax文件上傳。

所以我想我想要做的是替換代碼中的硬編碼數字,以便從web.config中的值讀取。然後,至少任何人都可以在部署網站時在web.config中更改該值。

你能做這樣的事嗎?

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

我在web.config中看到了一些使用appSettings的例子,例如

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

然後訪問它想:

ConfigurationManager.AppSettings["MySetting"] 

但那就意味着將在那裏自定義值,現在我們必須3個地方去改變它在web.config中。任何人有一個想法如何正確地做到這一點?

非常感謝

回答

29

你可以這樣做:

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

感謝你這個作品!它需要兩個名稱空間包括:'使用System.Configuration;'和'使用System.Web.Configuration;'。我已經接受了你的答案,因爲如果httpRuntime部分不存在,它會有錯誤處理,它會回落到一個很好的默認值。我嘗試從Web.config中刪除整個''部分,並且在可以到達此代碼之前,文件上傳完全失敗,所以我猜測它確實是需要的。所以,如果我擺脫了默認值代碼,那麼它會將它降低到2行,很好。 – zuallauz

7

嘗試:

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

謝謝你這個作品! – zuallauz

8

似乎有讀取system.webServer部分沒有簡單的方法,因爲它是從machine.config標記爲「忽略」。

一種方法是直接解析web.config文件的XML:

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

謝謝你!如果將來需要訪問system.webServer部分,這將非常有用。我設法只用'MaxRequestLength'屬性來代替它。系統中的'maxAllowedContentLength'。webServer/security/requestFiltering/requestsLimits似乎被system.web/httpRuntime中的'MaxRequestLength'屬性覆蓋。 – zuallauz

+0

他們在我的測試中似乎沒有被覆蓋。我必須設置兩個值。 – Rhyous

相關問題