【问题标题】:fetch/promises - ASPX method to return a serialize DataTable (Newtonsoft) - return Array of Json objectsfetch/promises - ASPX 方法返回序列化 DataTable (Newtonsoft) - 返回 Json 对象数组
【发布时间】:2018-11-16 18:18:23
【问题描述】:

我在 C# .ASMX 上有一个 Web 服务。

在这个类里面,我有以下方法:

[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 上使用 fetch / promise 获取此响应时,出现以下错误:

错误 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));
}

控制台画面:

是否存在使用 promise .json() 自动转换数据的解决方法?

我想问题是该方法没有返回 JSON 结构...返回一个带有 JSON 数据的数组(将每个项目数据行拆分为数组中的 JSON 对象)

【问题讨论】:

  • 粘贴实际文本而不是屏幕截图,以便我们确定它是否有效
  • @CamiloTerevinto:你是对的,该方法错过了最后一个括号。

标签: javascript c# asp.net json fetch


【解决方案1】:

解决方案非常简单... 仅在标题行中包含 + 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);

结果:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 2018-08-30
    • 2018-07-18
    • 1970-01-01
    • 2016-08-28
    • 2019-07-22
    • 2015-05-14
    相关资源
    最近更新 更多