如何从属性中获取值" maxAllowedContentLength" web.config以编程方式?

时间:2017-10-03 13:17:58

标签: c# asp.net .net webforms web-config

我需要访问web.config文件中的system.webServer/security/requestFiltering/requestLimits部分,以获取属性maxAllowedContentLength的值。验证配置需要此值,因此用户无法设置比web.config文件中定义的值更高的值。要验证此配置,还需要属性maxRequestLengthsystem.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。:我正在研究maxRequestLengthmaxAllowedContentLength的值可能会有所不同。

P.S.2。:我了解Microsoft.Web.Administration,但我需要一个不涉及此dll的解决方案。

2 个答案:

答案 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