fetch / promises - метод ASPX для возвращения сериализации DataTable (Newtonsoft) - возврат массива объектов Json - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть веб-сервис на C # .ASMX.

Внутри этого класса у меня есть следующий метод:

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public void getJson()
{
    DataTable data = "SELECT * FROM AT_MasterData Order by [Order]".fwSqlFillDataTable();

    string strResponse = JsonConvert.SerializeObject(data);

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

    Context.Response.Write(strResponse);
}

Метод работает отлично ... но когда япытаясь получить этот ответ, используя выборку / обещание на Javascript, я получил следующую ошибку:

Ошибка SyntaxError: Неожиданный конец ввода JSON

Код JS:

function getJson(sectionActual) {
    let url = './services/assessment.asmx/getJson';
    let headers = new Headers();

    headers.append('Accept', 'application/json'); // This one is enough for GET requests

    fetch(url,
        {
            method: "POST", 
            headers: headers
        })
        .then(result => result.json())
        .then(resultData => {
            console.log(resultData)
        })
        .catch(err => console.log("Error", err));

}

Если я изменил .json () на .text () по обещанию, то получил результат ...

JS Рабочий код:

function getJson(sectionActual) {
    let url = './services/assessment.asmx/getJson';
    let headers = new Headers();

    headers.append('Accept', 'application/json'); // This one is enough for GET requests

    fetch(url,
        {
            method: "POST", 
            headers: headers
        })
        .then(result => result.text())
        .then(resultData => {
            console.log(resultData)
        })
        .catch(err => console.log("Error", err));
}

Экранконсоли: enter image description here

Существует ли обходной путь для использования обещания .json () для автоматического преобразования данных?

Полагаю, проблема в том, что метод не возвращает структуру JSON ... возвращает массив с данными JSON (разбить каждую строку данных элемента в объекте JSON в массиве)

1 Ответ

0 голосов
/ 16 ноября 2018

Решение было довольно простым ... Включайте только + 1 в строку заголовка:

Context.Response.AddHeader("content-length", (strResponse.Length + 1).ToString());

Но я не могу определить причину добавления +1 в контент-длину.

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public void getJson()
{
    DataTable data = "SELECT * FROM AT_MasterData Order by [Order]".fwSqlFillDataTable();

    string strResponse = JsonConvert.SerializeObject(data);

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

    Context.Response.Write(strResponse);
}

Если я пытаюсь вернуть универсальный класс, преобразованный в JSON, мне нужно удалить это +1 (следующий код не возвращает содержимое в JS):

strResponse = JsonConvert.SerializeObject(new { test = "Hello World" });

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

Context.Response.Write(strResponse);

Это обещание не разрешается с .json() или .text() - оба не работают ...

Но, если я уберу +1 из длины контента ... работает:

strResponse = JsonConvert.SerializeObject(new { test = "Hello World" });

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

Context.Response.Write(strResponse);

Результат:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...