Ошибка "Операция недействительна из-за текущего состояния объекта" во время обратной передачи

У меня была страница aspx, которая работала хорошо, но внезапно я получаю сообщение об ошибке "Операция недействительна из-за текущего состояния объекта". всякий раз, когда выполняется обратная передача.

Трассировка стека:

в System.Web.HttpValueCollection.ThrowIfMaxHttpCollectionKeysExceeded()
в System.Web.HttpValueCollection.FillFromEncodedBytes(байт [] байт, кодировка)
в System.Web.HttpRequest.FillInFormCollection()

Может кто-нибудь помочь?

4 ответа

Решение

Кто-то разместил довольно много полей формы на вашей странице. Новое максимальное значение по умолчанию, введенное последним обновлением безопасности, составляет 1000.

Попробуйте добавить следующий параметр в ваш файл web.config <appsettings> блок. в этом блоке вы максимизируете значения MaxHttpCollection, это переопределит значения по умолчанию, установленные.net Framework. вы можете изменить значение в соответствии с вашими требованиями

<appSettings>
    <add key="aspnet:MaxHttpCollectionKeys" value="2001" />
 </appSettings>

Для получения дополнительной информации, пожалуйста, прочитайте этот пост. Подробнее о патче безопасности от Microsoft вы можете прочитать в этой статье базы знаний.

Я не применил пейджинг к моему сетевому виду, и он распространяется на более чем 600 записей (с флажками, кнопками и т. Д.), А значение 2001 года не сработало. Вы можете увеличить значение, скажем, 10000 и проверить.

<appSettings>
<add key="aspnet:MaxHttpCollectionKeys" value="10000" />
</appSettings>

В ASP.NET 1.1 это по-прежнему связано с тем, что кто-то публикует более 1000 полей формы, но параметр должен быть изменен в реестре, а не в файле конфигурации. Он должен быть добавлен как DWORD с именем MaxHttpCollectionKeys в реестр под

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\1.1.4322.0

для 32-разрядных версий Windows и

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

для 64-разрядных версий Windows.

Если ваша трассировка стека выглядит следующим образом, то вы отправляете огромную нагрузку json-объектов на сервер

Operation is not valid due to the current state of the object. 
    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)

Для разрешения, пожалуйста, обновите веб-конфигурацию следующим ключом. Если вы не можете получить трассировку стека, пожалуйста, используйте fiddler. Если это не помогло, попробуйте увеличить число до 10000 или что-то в этом роде.

<configuration>
<appSettings>
<add key="aspnet:MaxJsonDeserializerMembers" value="1000" />
</appSettings>
</configuration>

Для более подробной информации, пожалуйста, прочитайте эту статью Microsoft kb

Другие вопросы по тегам