我需要访问web.config文件中的system.webServer/security/requestFiltering/requestLimits
部分,以获取属性maxAllowedContentLength
的值。验证配置需要此值,因此用户无法设置比web.config文件中定义的值更高的值。要验证此配置,还需要属性maxRequestLength
(system.web/httpRuntime
)中的值,但我们已通过以下代码获取该值:
(ConfigurationManager.GetSection("system.web/httpRuntime") as System.Web.Configuration.HttpRuntimeSection).MaxRequestLength
我已经尝试过了:
(ConfigurationManager.GetSection("system.webServer") as IgnoreSection).SectionInformation.GetRawXml()
,但会引发System.InvalidOperationException
。
(System.Web.Configuration.WebConfigurationManager.GetSection("system.webServer") as IgnoreSection).SectionInformation.GetRawXml()
,但它也会引发System.InvalidOperationException
。
ConfigurationManager.GetSection("system.webServer/security/requestFiltering/requestLimits/maxAllowedContentLength")
,但会返回null
。
System.Web.Configuration.WebConfigurationManager.GetSection("system.webServer/security/requestFiltering/requestLimits/maxAllowedContentLength")
,但它也会返回null
。
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
按照DiskJunky的建议,但它会抛出一个System.ArgumentException
,并且消息" exePath必须在不在独立的exe内运行时指定&# 34;
另外,我制作了以下代码:
using (System.IO.StreamReader reader = new System.IO.StreamReader(System.Web.HttpRuntime.AppDomainAppPath + "/web.config"))
{
System.Xml.XmlDocument xmlDocument = new System.Xml.XmlDocument();
xmlDocument.LoadXml(reader.ReadToEnd());
if (xmlDocument.GetElementsByTagName("requestLimits").Count > 0)
{
var attrMaxAllowedContentLength = xmlDocument.GetElementsByTagName("requestLimits")[0].Attributes.Cast<System.Xml.XmlAttribute>().FirstOrDefault(atributo => atributo.Name.Equals("maxAllowedContentLength"));
return (Convert.ToDecimal(attrMaxAllowedContentLength.Value) / (decimal)(Math.Pow(1024, 2)));
}
//Default value of the configuration
return (decimal)28.6;
}
但我觉得这不是最好的解决方案。
P.S。:我正在研究maxRequestLength
和maxAllowedContentLength
的值可能会有所不同。
P.S.2。:我了解Microsoft.Web.Administration,但我需要一个不涉及此dll的解决方案。
答案 0 :(得分:3)
我的回答是你的最终结论是正确的。
我找不到更好的东西。我通过一些调整来完成你的答案,并且能够正确地将[MaxRequestLength]作为字节。然后我对两个值都进行了Math.Min,让我的用户知道实际限制是两个设置中的较低者。
/// <summary>
/// Get [maxAllowedContentLength] from web.config
/// </summary>
internal static long GetMaxAllowedContentLengthBytes()
{
const long DefaultAllowedContentLengthBytes = 30000000;
using (System.IO.StreamReader reader = new System.IO.StreamReader(System.Web.HttpRuntime.AppDomainAppPath + "/web.config"))
{
System.Xml.XmlDocument xmlDocument = new System.Xml.XmlDocument();
xmlDocument.LoadXml(reader.ReadToEnd());
if (xmlDocument.GetElementsByTagName("requestLimits").Count > 0)
{
var maxAllowedContentLength = xmlDocument.GetElementsByTagName("requestLimits")[0].Attributes.Cast<System.Xml.XmlAttribute>().FirstOrDefault(atributo => atributo.Name.Equals("maxAllowedContentLength"));
return Convert.ToInt64(maxAllowedContentLength.Value);
}
else
return DefaultAllowedContentLengthBytes;
}
}
/// <summary>
/// Get [MaxRequestLength] from web.config
/// </summary>
internal static long GetMaxRequestLengthBytes()
{
return (HttpContext.Current.GetSection("system.web/httpRuntime") as System.Web.Configuration.HttpRuntimeSection).MaxRequestLength * 1024;
}
答案 1 :(得分:0)
该答案取决于web.config中现有的设置。 您要么必须放入多个If语句来处理不存在的标记,要么要处理抛出的错误。 我需要的是一种获取数字的方法,即使它是在IIS中而不是在web.config中设置的。 我使用了Microsoft here 推荐的解决方案(请参阅页面底部的代码)
这就是我在VB中所做的
Private Function GetmaxAllowedContentLength() As Nullable(Of Int64)
Dim serverManager As ServerManager = New ServerManager
Dim config As Configuration = serverManager.GetWebConfiguration(GetExecutingAssembly.GetName.Name)
Dim requestFilteringSection As ConfigurationSection = config.GetSection("system.webServer/security/requestFiltering")
Dim requestLimitsElement As ConfigurationElement = requestFilteringSection.GetChildElement("requestLimits")
Dim value As Nullable(Of Int64) = requestLimitsElement.Item("maxAllowedContentLength")
Return value
End Function