Paljon lomakeavaimia, tiedostoja tai JSON-hyötykuormajäseniä sisältävä ASP.NET-pyyntö epäonnistuu ja antaa poikkeuksen

Yhteenveto

Microsoft-suojauspäivitys MS11-100 rajoittaa HTTP-pyynnön lomakeavainten, tiedostojen ja JSON-hyötykuormajäsenten enimmäismääräksi 1 000. Tämän muutoksen vuoksi ASP.NET-sovellukset hylkäävät pyynnöt, joissa on yli 1 000 tällaista elementtiä. Tällaisia pyyntöjä tekevät HTTP-asiakkaat estetään, ja selaimeen tulee näkyviin virhesanoma. Virhesanomassa on yleensä HTTP 500 -tilakoodi. Tämän uuden rajoituksen voi määrittää sovelluskohtaisesti. Määritysohjeet ovat ongelmanratkaisuosiossa.


Oire

Paljon lomakeavaimia, tiedostoja tai JSON-hyötykuormaa sisältävät ASP.NET-pyynnöt saa virhevastauksen palvelimesta. Palvelimessa olevassa sovelluslokissa on varoitusmerkintä Lähde-määrityksellä, joka on tietty ASP.NET-versio, sekä tapahtumatunnus 1309. Tapahtumaloki sisältää jonkin seuraavista sanomista:


Sanoma 1:
Sovelluksen tiedot:
Sovelluksen toimialue: /LM/W3SVC/1/ROOT/<Sovelluksen toimialue>
Luottamustaso: Normaali
Sovelluksen näennäispolku: <VDIR-polku>
Sovelluksen polku: <Sovelluksen polku>
Koneen nimi: <Koneen nimi>
Prosessin tiedot:
Prosessin tunnus: 0001
Prosessin nimi: w3wp.exe
Tilin nimi: IIS APPPOOL\DefaultAppPool

Poikkeuksen tiedot:
Poikkeuksen laji: HttpException
Poikkeuksen sanoma: URL-koodatut lomaketiedot ovat virheellisiä.
at System.Web.HttpRequest.FillInFormCollection()
at System.Web.HttpRequest.get_Form()
at System.Web.HttpRequest.get_HasForm()
at System.Web.UI.Page.GetCollectionBasedOnMethod(Boolean dontReturnNull)
at System.Web.UI.Page.DeterminePostBackMode()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)


Sanoma 2:
Sovelluksen tiedot:
Sovelluksen toimialue: /LM/W3SVC/1/ROOT/<Sovelluksen toimialue>
Luottamustaso: Normaali
Sovelluksen näennäispolku: <VDIR-polku>
Sovelluksen polku: <Sovelluksen polku>
Koneen nimi: <Koneen nimi>

Prosessin tiedot:
Prosessin tunnus: 0001
Prosessin nimi: w3wp.exe
Tilin nimi: IIS APPPOOL\DefaultAppPool

Poikkeuksen tiedot:
Poikkeuksen laji: InvalidOperationException
Poikkeuksen sanoma: Toiminto ei ole käytettävissä objektin nykyisen tilan vuoksi.
at System.Web.HttpRequest.FillInFilesCollection()
at System.Web.HttpRequest.get_Files()
at FileUpload.Page_Load(Object sender, EventArgs e)
at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
at System.Web.UI.Control.OnLoad(EventArgs e)
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint

Sanoma 3:
Sovelluksen tiedot:
Sovelluksen toimialue: /LM/W3SVC/1/ROOT/<Sovelluksen toimialue>
Luottamustaso: Normaali
Sovelluksen näennäispolku: <VDIR-polku>
Sovelluksen polku: <Sovelluksen polku>
Koneen nimi: <Koneen nimi>

Prosessin tiedot:
Prosessin tunnus: 0001
Prosessin nimi: w3wp.exe
Tilin nimi: IIS APPPOOL\DefaultAppPool

Poikkeuksen tiedot:
Poikkeuksen laji: InvalidOperationException
Poikkeuksen sanoma: Toiminto ei ole käytettävissä objektin nykyisen tilan vuoksi.
at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 depth)
at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)
at System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)
at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)
at System.Web.Script.Serialization.JavaScriptSerializer.DeserializeObject(String input)
at Failing.Page_Load(Object sender, EventArgs e)
at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
at System.Web.UI.Control.OnLoad(EventArgs e)
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)


IIS-lokitiedostossa näkyy seuraavankaltainen merkintä:
2011-01-01 00:00:00 ::1 POST /machine/default.aspx - 80 - ::1 - 500 0 0 187




Syy

Microsoft-suojauspäivitys, jota suojaustiedote MS11-100 koskee, muuttaa ASP.NETin pyynnössä hyväksymien lomakeavainten, tiedostojen ja JSON-jäsenten enimmäismääräksi 1 000. Tämä muutos on tehty Microsoft-suojaustiedotteessa MS11-100 dokumentoidun palvelunestoheikkouden korjaamiseksi.


Ratkaisu

Tämän lomakeavain- tai tiedostorajoituksen saavuttavat sovellukset voivat muokata ASP.NET-sovellusasetusta aspnet:MaxHttpCollectionKeys, mikä on kuvattu alla olevassa ASP.NET-sovelluksen kokoonpanotiedostossa. Tämä asetus korjaa tämän artikkelin oireista kertovassa kohdassa kuvatut virhesanomat 1 ja 2.
<configuration>
<appSettings>
<add key="aspnet:MaxHttpCollectionKeys" value="1000" />
</appSettings>
</configuration>


Huomautus Jos ASP.NET 1.1 on käytössä x86-järjestelmässä, asetusta säädetään lisäämällä DWORD-arvo seuraavaan rekisteriavaimeen:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\1.1.4322.0\MaxHttpCollectionKeys
Jos ASP.NET 1.1 on käytössä x64-järjestelmässä, asetusta säädetään lisäämällä DWORD-arvo seuraavaan rekisteriavaimeen:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\ASP.NET\1.1.4322.0\MaxHttpCollectionKeys



Tämän JSON-hyötykuormarajoituksen saavuttavat sovellukset voivat muokata ASP.NET-sovellusasetusta aspnet:MaxJsonDeserializerMembers, mikä on kuvattu alla olevassa ASP.NET-sovelluksen kokoonpanotiedostossa. Tämä asetus korjaa tämän artikkelin oireista kertovassa kohdassa kuvatun virhesanoman 3.
<configuration>
<appSettings>
<add key="aspnet:MaxJsonDeserializerMembers" value="1000" />
</appSettings>
</configuration>



Huomautus Jos tämä arvo on oletusasetusta suurempi, palvelin on tavallista alttiimpi suojaustiedotteessa MS11-100 kuvatulle palvelunestoheikkoudelle.


Suositukset

Lisätietoja suojaustiedotteesta MS11-100 on seuraavassa TechNet-artikkelissa: Saat lisätietoja napsauttamalla seuraavaa artikkelin numeroa, jolloin pääset lukemaan artikkelin Microsoft Knowledge Base -tietokannassa:
2638420 MS11-100: .NET Framework -ytimen heikkous saattaa mahdollistaa käyttöoikeuksien laajentamisen: 29.12.2011
Ominaisuudet

Artikkelin tunnus: 2661403 – Viimeisin tarkistus: 29.11.2012 – Versio: 1

Palaute