RASHID ALI786 Ответов: 2

Веб - службы не могут вернуть полный json


Я разрабатываю ASP.NET веб-приложение, использующее веб-сервисы и Ajax.
В веб-сервисе у меня есть метод, где я получаю данные на арабском языке, урду из базы данных и конвертирую их в JSON, но на стороне клиента я не получил полные данные формата JSON, которые из-за ошибки в jquery "JSON Parse".

Для английского языка мой код работает правильно, он выдает ошибку только всякий раз, когда есть какие-то данные на арабском языке, урду.


В базе данных у меня есть таблица с именем "dd_diaryDetail"

Что я уже пробовал:

object dta = null;
using (DD_db db = new DD_db())
{
db.Database.Connection.Open();
 var filval = filtervalue.Split(':');
string cmd = "SELECT * FROM dd_diaryDetail WHERE (tcs_id = @tcsid) AND (dd_date = @dt)";
dta = db.Database.SqlQuery<diarydetailview>(cmd, new SqlParameter("@tcsid", filval[0]),new SqlParameter("@dt", filval[1])).ToList();
if (dta != null)
{
db.Database.Connection.Close();
var res_data = js.Serialize(dta);
Context.Response.Clear();
Context.Response.ContentType = "application/json; charset=utf-8";
Context.Response.AddHeader("content-length", res_data.Length.ToString());
Context.Response.Write(res_data);
Context.Response.Flush();
}
db.Database.Connection.Close();
}

В результате я получаю неполный массив JSON
[{"dd_id":8,"tcs_id":8,"dd_date":"02-03-2020","CW_unitno":"44","CW_title":"ajdsaj","CW_pageno":"۳۳","CW_qno":"۸۸","CW_activity":"طگطگشدش","HW_unitno":"۷۷","HW_title":"چفچفچف","HW_pageno":"۷۷","HW_qno":"۹۹","HW_activity":"شفچففچففچفچ","Tst_unitno":"۵۵۵","Tst_title":"چفچفشش","Tst_pageno":"۴۴","Tst_qno":"۳۳","Tst_activity":"رچرچ"

0x01AA

Какой тип SQL-сервера вы используете? Очень странно в наши дни попасть в нечто подобное...

2 Ответов

Рейтинг:
2

MadMyche

Есть несколько уровней, на которых вы могли бы иметь поломку на этом; и это займет устранение неполадок с вашей стороны, чтобы определить, где проблема.

1. После вашего запроса в EF, каково содержание ДТА? Сколько существует записей по сравнению с тем, сколько их должно быть?

2. Осмотрите отдельный экземпляр diarydetailview внутри ДТА- Она закончена? Повторите над несколькими и экземпляром, который бросает проблему.

3. Проверьте и подтвердите содержание res_data так же как и длина.



Прочие вещи....

Знаете ли вы, что вы закрываете БД?Подключение дважды, если она заполняется?

Какую версию NET вы используете? По-видимому, не все сериализаторы JSON одинаковы:
Ссылка: c# - сериализация списка в JSON - переполнение стека[^]

Какой браузер вы используете? А как вы называете свой AJAX (jquery/ version)? Это возвращает нас к вопросу о данных/длине выше:
Ссылка: служба ajax - WCF возвращает неверную длину содержимого при использовании кодировки gzip - переполнение стека[^]


Рейтинг:
16

Richard Deeming

Цитата:
Context.Response.AddHeader("content-length", res_data.Length.ToString());
Эта линия и есть проблема.

Заголовок content length определяет количество байты в теле ответа. Вы отправляете номер телефона персонажи вместо.

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

UTF-8 - Википедия[^]

Большинство браузеров усекают тело ответа, когда оно достигает количества байтов, указанного в заголовке content length, поэтому вы получаете неполный ответ.

Самым простым вариантом было бы удалить строку, которая задает заголовок длины содержимого. В противном случае вам нужно будет точно знать, сколько байтов вы отправляете:
string res_data = js.Serialize(dta);
byte[] res_bytes = System.Text.Encoding.UTF8.GetBytes(res_data);

Context.Response.Clear();
Context.Response.ContentType = "application/json; charset=utf-8";
Context.Response.AddHeader("content-length", res_bytes.Length.ToString());
Context.Response.BinaryWrite(res_bytes);
Context.Response.Flush();