2015-11-13 6 views
1

В проекте веб-форм я загружаю jqGrid, используя хранимую процедуру SQL, где я возвращаю данные как json. Во время начальной настройки и тестирования я возвращал 85 строк данных. Затем я изменил параметры, которые привели к возврату 1 868 строк, за исключением того, что они не отображались в сетке.Что означает свойство maxJsonLength?

После отладки в Firebug я увидел ошибку «Длина строки превышает значение, установленное в свойстве maxJsonLength». Я исправил это, установив maxJsonLength = "2147483647" в моем webconfig как найденный в популярном сообщении Stackovrflow.

Итак, мой вопрос в том, какая строка была причиной ошибки? Это длина всей записи данных или длина данных в одном из возвращаемых столбцов?

Я видел примеры jqGrid, возвращающие гораздо больше данных. Спасибо за понимание.

Update

Я принял совет Oļegs и использовал NuGet установить Newtonsoft.Json в моем проекте. я внес изменения в свой код, чтобы использовать его:

В коде - .cs у меня есть это:

using Newtonsoft.Json; 

общественный частичный класс Default2: System.Web.UI.Page {

[WebMethod] 
public static string GetDataFromDB() 

{ 
    DataSet ds = new DataSet(); 


    string con = System.Configuration.ConfigurationManager.ConnectionStrings["SQLCon"].ToString(); 
    SqlConnection SCon = new SqlConnection(con); 
    SCon.Open(); 
    SqlCommand sqlCmd = new SqlCommand("dbo.usp_GetProjectDetails", SCon); 
    sqlCmd.CommandType = CommandType.StoredProcedure; 

    sqlCmd.Parameters.Add("@ProjNum", SqlDbType.Int).Value = DBNull.Value; 
    sqlCmd.Parameters.Add("@TrakIt", SqlDbType.VarChar, 255).Value = DBNull.Value; 
    sqlCmd.Parameters.Add("@Title", SqlDbType.VarChar, 255).Value = DBNull.Value; 
    sqlCmd.Parameters.Add("@Status", SqlDbType.VarChar, 255).Value = DBNull.Value; 
    sqlCmd.Parameters.Add("@Dept", SqlDbType.Int).Value = DBNull.Value; 
    sqlCmd.Parameters.Add("@AssignTo", SqlDbType.Int).Value = DBNull.Value; //19; 
    sqlCmd.Parameters.Add("@RecDate", SqlDbType.DateTime).Value = DBNull.Value; 
    sqlCmd.Parameters.Add("@CmpDate", SqlDbType.DateTime).Value = DBNull.Value; 
    sqlCmd.Parameters.Add("@EndDate", SqlDbType.DateTime).Value = DBNull.Value; 
    sqlCmd.Parameters.Add("@ExComp", SqlDbType.Int).Value = DBNull.Value; 
    sqlCmd.Parameters.Add("@ExAcReq", SqlDbType.Int).Value = DBNull.Value; 

    SqlDataAdapter da = new SqlDataAdapter(sqlCmd); 
    da.Fill(ds); 
    SCon.Close(); 

    return JsonConvert.SerializeObject(ds.Tables[0]); 
} 

функция в .aspx выглядит следующим образом:

<script type="text/javascript"> 
    $(document).ready(function() { 
     $.ajax({ 
      type: "POST", 
      contentType: "application/json", 
      data: "{}", 
      url: "Default2.aspx/GetDataFromDB", 
      dataType: "json", 
      success: function (data) { 
       data = data.d; 
       $("#list1").jqGrid({ 
        datatype: "local", 
         colNames: ["Project #", "Trak-It #", "Priority", "Title", "Status", "Department", "Assigned To", "Resource", "Requestor"], 
         colModel: [ 
              { name: 'Project Number', index: 'Project Number', width: 80, key: true, formatter: 'showlink', formatoptions: { baseLinkUrl: 'Details.aspx', target: '_new' } }, 
              { name: 'Trak-It #', index: 'Trak-It #', width: 80 }, 
              { name: 'Priority', index: 'Priority', width: 80 }, 
              { name: 'Title', index: 'Title', width: 200 }, 
              { name: 'Status', index: 'Status', width: 80 }, 
              { name: 'Department', index: 'Department', width: 180 }, 
              { name: 'Assigned To', index: 'Assigned To', width: 100 }, 
              { name: 'Resource', index: 'Resource', width: 160 }, 
              { name: 'Requestor', index: 'Requestor', width: 140 } 
         ], 
         data: JSON.parse(data), 
         rowNum: 8, 
         rowList: [10, 20, 30], 
         pager: '#pager1', 
         caption: "Test Grid", 
         viewrecords: true, 
         ignoreCase: true, 
         async: true, 
         loadonce: true, 
         gridview: true, 
         width: 1000 
       }); 
      } 
     }); 
    }); 

</script> 

И, наконец, в Web.config, я закомментирована maxjsonLength:

<system.web.extensions> 
<scripting> 
    <webServices> 
    <jsonSerialization maxJsonLength="2147483647"> 
    </jsonSerialization> 
    </webServices> 
</scripting> 

Но я все еще получаю ошибку = «Ошибка при сериализации или десериализации с помощью JSON JavaScriptSerializer. Длина строки превышает значение, установленное в свойстве maxJsonLength. "

Если я раскомментирую настройки web.config, он работает нормально. Если я оставлю его закомментированным и возвратит меньше данных, он отлично работает. мне не хватает?

ответ

0

вы имеете в виду вероятно System.Web.Script.Serialization.JavaScriptSerializer.MaxJsonLength свойство, которое требуется увеличение в глобальном масштабе, если вы используете интерфейс WebServices в коде сервера. решение было описано в the answer, например.

вы спрашиваете о справочной информации о проблеме По правде говоря, основная проблема заключается в том, что использование очень старого интерфейса WebService в A Приложения SP.NET. Это была первая попытка Microsoft, много лет назад, вернуть данные XML или JSON на основе заголовка HTTP-запроса Content-Type. Он был реализован в .NET Framework 3.5. Веб-служба должна вернуть объект (а не строку), который будет сериализован платформой .NET для строки JSON с использованием JavaScriptSerializer. Ваш код не использует JavaScriptSerializer напрямую. Поскольку вы не используете JavaScriptSerializer напрямую, вы можете настроить параметры JavaScriptSerializer только в web.config.

Другими словами, вы должны использовать MaxJsonLength настройки JavaScriptSerializer в web.config каждый раз, если размер возвращаемых данных может быть больше, чем примерно 100k.

Ограничение 100k для веб-метода было относительно большим 8 лет назад (в 2007 году) на момент публикации .NET Framework 3.5. Позже Microsoft представила интерфейс WCF, который значительно упростил сериализацию JSON и не имеет такого небольшого ограничения. WCF тоже слишком старый, но он позволяет еще сделать ручную сериализацию, используя более производительную версию сериализатора JSON (см., Например, the answer). После WCF Microsoft представила ASP.NET MVC, а затем WebAPI. Теперь Microsoft работает на ASP.NET 5 и MVC версии 6, которые объединяют MVC и WebAPI под одним именем MVC6. Начиная с MVC2 (или MVC3) Microsoft прекратила разработку собственного JSON-сериализатора и предложила использовать какой-то другой. Microsoft использует в основном Newtonsoft.Json (синоним Json.NET), который не самый быстрый, но относительно хороший и мощный.

Я не хочу писать слишком много слишком распространенных вещей, но я бы рекомендовал вам отказаться от стиля использования WeboServices и перейти к другому интерфейсу, который дает вам больше свободы в выборе сериализатора JSON. Если вы поддерживаете какой-то старый код и не можете использовать более современные технологии, я бы рекомендовал вам использовать дескриптор ASHX, который очень старый, но гораздо более гибкий, как WebServices. Я рекомендую посмотреть в the old answer, где я прикрепил Visual Studio Project, который использовал ручку ASHX и возвращал данные JSON, используя Newtonsoft.Json (Json.NET). Вы можете заменить Newtonsoft.Json на любой другой класс сериализатора JSON, который вам больше нравится.

+0

Олег - спасибо за информацию, хотя я не уверен, что следую вашему последнему абзацу. Я использую веб-формы, чтобы воспользоваться услугами членства, и мне нужна фиксированная сетка типа заголовка, чтобы отображать результаты из хранимой процедуры - таким образом, мое использование jqGrid. В своих исследованиях я фактически загрузил ваш проект VS, но мне показалось, что мне нужно было сделать. – Brian

+0

Кроме того, это новый проект, и я только начинаю писать код на C#. Поэтому я полагаю, что ответ заключается в том, что существует ограничение на количество возвращаемых данных json, и я могу столкнуться с проблемой с большим набором результатов. – Brian

+0

Если вы только начинаете код на C#, тогда я бы рекомендовал вам использовать ASP.NET MVC5 и реализовать действие контроллера, которое просто возвращает ** все данные **, возвращенные из STORED PROCEDURE. Вы должны просто добавить опцию 'loadonce: true' jqGrid. Затем jqGrid будет выполнять разбиение на страницы/фильтрацию/сортировку всех данных ** локально **. MVC5 использует 'Newtonsoft.Json' по умолчанию, если вы просто возвращаете' Json (listOfItems, JsonRequestBehavior.AllowGet) 'из действия контроллера. Таким образом, вам нужно просто подготовить «Список » по результатам вызова STORED PROCEDURE. – Oleg

Смежные вопросы