2017-10-03 3 views
1

Ich muss auf den Abschnitt system.webServer/security/requestFiltering/requestLimits aus der Datei web.config zugreifen, um den Wert des Attributs maxAllowedContentLength zu erhalten. Dieser Wert wird zum Überprüfen einer Konfiguration benötigt, sodass der Benutzer keinen höheren Wert als den in der Datei web.config definierten Wert festlegen kann. Zur Validierung dieser Konfiguration wird der Wert aus dem Attribut maxRequestLength (system.web/httpRuntime) ist ebenfalls erforderlich, aber wir sind immer schon diesen Wert durch den Code unten:Wie wird der Wert vom Attribut "maxAllowedContentLength" von web.config programmgesteuert abgerufen?

(ConfigurationManager.GetSection("system.web/httpRuntime") as System.Web.Configuration.HttpRuntimeSection).MaxRequestLength 

Ich habe schon versucht:

  • (ConfigurationManager.GetSection("system.webServer") as IgnoreSection).SectionInformation.GetRawXml(), aber es wirft eine System.InvalidOperationException.

  • (System.Web.Configuration.WebConfigurationManager.GetSection("system.webServer") as IgnoreSection).SectionInformation.GetRawXml(), aber es wirft auch eine System.InvalidOperationException.

  • ConfigurationManager.GetSection("system.webServer/security/requestFiltering/requestLimits/maxAllowedContentLength"), aber es gibt null zurück.

  • System.Web.Configuration.WebConfigurationManager.GetSection("system.webServer/security/requestFiltering/requestLimits/maxAllowedContentLength"), aber es gibt auch null zurück.

  • ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None) wie DiskJunky vorgeschlagen, aber es wirft ein System.ArgumentException, mit der Meldung „ExePath muss angegeben werden, wenn sie nicht in einer Stand-alone-exe ausgeführt wird“.

Auch habe ich den Code unten:

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; 
} 

Aber ich tought es nicht die beste Lösung war.

S.S .: Ich arbeite mit der Möglichkeit, dass der Wert von maxRequestLength und maxAllowedContentLength abweichen kann.

P.S.2 .: Ich weiß über die Microsoft.Web.Administration, aber ich brauche eine Lösung, die diese DLL nicht beinhaltet.

+1

Mögliches Duplikat [Get maxRequestLength Wert von spezifischem Standortpfad in config] (https://stackoverflow.com/questions/34093968/get-maxrequestlength-value-from-specific-location-path-in-config) – DiskJunky

Antwort

1

Meine Antwort ist, dass Ihre endgültige Schlussfolgerung richtig ist.

Ich konnte nichts besseres finden. Ich habe deine Antwort mit ein paar Optimierungen abgeschlossen und die Möglichkeit eingeschlossen, die [MaxRequestLength] als Bytes korrekt zu erhalten. Ich mache dann eine Math.Min auf beiden Werten, um meine Benutzer wissen zu lassen, dass das tatsächliche Limit die niedrigere der beiden Einstellungen ist.

/// <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; 
    } 
Verwandte Themen