{"id":3311,"date":"2015-12-28T14:43:33","date_gmt":"2015-12-28T13:43:33","guid":{"rendered":"https:\/\/u-labs.de\/?p=3311"},"modified":"2015-12-28T14:43:33","modified_gmt":"2015-12-28T13:43:33","slug":"iis-groessenlimit-fuer-dateiuploads-erhoehen-maxrequestlength","status":"publish","type":"post","link":"https:\/\/u-labs.de\/portal\/iis-groessenlimit-fuer-dateiuploads-erhoehen-maxrequestlength\/","title":{"rendered":"IIS: Gr\u00f6\u00dfenlimit f\u00fcr Dateiuploads erh\u00f6hen (maxRequestLength)"},"content":{"rendered":"<p>Der IIS besitzt ein Gr\u00f6\u00dfenlimit f\u00fcr hochgeladene Dateien, wie\u00a0man es von so ziemlich jedem anderen Webserver auch kennt. Standardm\u00e4\u00dfig liegt dies bei 4 MB &#8211; F\u00fcr rein textbasierte Formulare also v\u00f6llig ausreichend. M\u00f6chte man jedoch eine Upload-Funktion f\u00fcr Dateien in einer ASP.NET Webanwendung integrieren, st\u00f6\u00dft man damit schnell an seine Grenzen. In diesem Fall bricht der IIS die Anfrage mit der Fehlermeldung\u00a0<strong>Die Maximale Anforderungsgr\u00f6\u00dfe wurde \u00fcberschritten<\/strong> ab.<\/p>\n<p>Zun\u00e4chst m\u00fcssen wir daf\u00fcr das Attribute\u00a0<strong>maxRequestLength<\/strong> auf den gew\u00fcnschten Wert erh\u00f6hen:<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;configuration&gt;\r\n    &lt;system.web&gt;\r\n        &lt;httpRuntime maxRequestLength=&quot;16384&quot; \/&gt;\r\n    &lt;\/system.web&gt;\r\n&lt;\/configuration&gt;\r\n<\/pre>\n<p>Die Abgabe erfolgt in Kilobytes und entspricht in diesem Beispiel daher 16 MB. Sollte der httpRuntime-Knoten bereits vorhanden sein, darf er nicht erneut definiert werden. Man kann ihn einfach mit dem Attribut erweitern. Beispiel:<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;httpRuntime targetFramework=&quot;4.5.2&quot; maxRequestLength=&quot;16384&quot; \/&gt;\r\n<\/pre>\n<p>F\u00fcr alte IIS-Installationen\u00a0dies aus. Die Aktuellen ab IIS Version 7 ben\u00f6tigen zus\u00e4tzlich noch folgende Direktive:<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;system.webServer&gt;\r\n   &lt;security&gt;\r\n      &lt;requestFiltering&gt;\r\n         &lt;!-- Gleiche Angabe wie maxRequestLength, jedoch in Bytes statt KB --&gt;\r\n         &lt;requestLimits maxAllowedContentLength=&quot;16777216&quot; \/&gt;\r\n      &lt;\/requestFiltering&gt;\r\n   &lt;\/security&gt;\r\n &lt;\/system.webServer&gt;\r\n<\/pre>\n<p>Ab IIS 7 ist das Filtern von Abfragen anhand ihrer Gr\u00f6\u00dfe n\u00e4mlich ein Sicherheits-Feature, um DDoS-Attacken mit \u00fcberm\u00e4\u00dfig gro\u00dfen Dateiuploads entgegenzuwirken.\u00a0Verwirren kann an dieser Stelle jedoch die Besonderheit, dass\u00a0<strong>maxAllowedContentLength<\/strong> in Bytes angegeben wird &#8211; Obwohl der Wert mit\u00a0<strong>maxRequestLength<\/strong> \u00fcbereinstimmen muss, der wiederum in Kilobytes vorliegt. Die 16384 KB von oben entsprechen daher an dieser Stelle 16384 KB * 1024 = 16777216 Bytes.<\/p>\n<h2><strong>Weitere Ma\u00dfnahmen f\u00fcr reibungslose Dateiuploads in ASP.NET<\/strong><\/h2>\n<h3><strong>Timeout erh\u00f6hen<\/strong><\/h3>\n<p>Je nach Gr\u00f6\u00dfe der erwarteten Dateiuploads bietet es sich zudem an, den Timeout zu erh\u00f6hen. Beispielsweise auf 5 Minuten, wenn die Nutzer gr\u00f6\u00dfere Dateien hochladen d\u00fcrfen. Dazu setzt man das Attribut <strong>executionTimeout<\/strong> im <strong>httpRuntime<\/strong> Knoten:<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;httpRuntime maxRequestLength=&quot;16384&quot; executionTimeout=&quot;300&quot; \/&gt;\r\n<\/pre>\n<p>Ansonsten k\u00f6nnte der Upload durch das Erreichen des Timeouts (Standardm\u00e4\u00dfig 90 Sekunden) abgebrochen werden. Dieses Risiko droht insbesondere bei Nutzern mit langsamer Internetverbindung.<\/p>\n<h3><strong>Fehlermeldung bei Exceptions anzeigen<\/strong><\/h3>\n<p>F\u00fcr den Fall, dass der Nutzer eine zu gro\u00dfe Datei hochl\u00e4d, macht das Abfangen dieser Exception Sinn. Daf\u00fcr k\u00f6nnen wir das <strong>Application_Error<\/strong>-Event in der <strong>Global.asax<\/strong> nutzen, um den letzten serverseitigen Fehler auszulesen:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\nprivate void Application_Error(object sender, EventArgs e) {\r\n    var ex = Server.GetLastError();\r\n    var httpException = ex as HttpException ?? ex.InnerException as HttpException;\r\n    if(httpException == null) {\r\n        return;\r\n    }\r\n    if(httpException.WebEventCode == WebEventCodes.RuntimeErrorPostTooLarge) {\r\n        \/\/ Dem Nutzer eine aussagekr\u00e4ftige Fehlerseite ausgeben, dass seine Datei zu gro\u00df ist\r\n        Response.Write(&quot;Die hochgeladene Datei ist leider zu gro\u00df&quot;);\r\n    }\r\n}\r\n<\/pre>\n<p>Dies ist nat\u00fcrlich nur beispielhaft\u00a0und f\u00fchrt zu einer\u00a0<em>nackten<\/em>, wei\u00dfen Fehlerseite. F\u00fcr den Produktiveinsatz w\u00fcrde es sich an dieser Stelle anbieten, den Nutzer auf eine Fehlerseite zu leiten, wo er auf die maximale Gr\u00f6\u00dfe f\u00fcr Uploads hingewiesen wird.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Der IIS besitzt ein Gr\u00f6\u00dfenlimit f\u00fcr hochgeladene Dateien, wie\u00a0man es von so ziemlich jedem anderen Webserver auch kennt. Standardm\u00e4\u00dfig liegt dies bei 4 MB &#8211; F\u00fcr rein textbasierte Formulare also v\u00f6llig ausreichend. M\u00f6chte man jedoch eine Upload-Funktion f\u00fcr Dateien in einer ASP.NET Webanwendung integrieren, st\u00f6\u00dft man damit schnell an seine Grenzen. In diesem Fall bricht &#8230;<\/p>\n","protected":false},"author":5,"featured_media":3316,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[62,61,63],"tags":[345,343,349,348,347,346,344],"class_list":["post-3311","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-server","category-softwareentwicklung","category-windows-server","tag-dateiupload","tag-iis","tag-iis6","tag-iis7","tag-iis8","tag-limits","tag-maxrequestlength"],"_links":{"self":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/3311","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/comments?post=3311"}],"version-history":[{"count":4,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/3311\/revisions"}],"predecessor-version":[{"id":3315,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/3311\/revisions\/3315"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media\/3316"}],"wp:attachment":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media?parent=3311"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/categories?post=3311"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/tags?post=3311"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}