【问题标题】:JSON truncated when passed from web page to ASP.NET Web API service从网页传递到 ASP.NET Web API 服务时 JSON 被截断
【发布时间】:2017-08-14 17:12:57
【问题描述】:

我有一个接受 JSON 数据的 ASP.NET Web API 服务。它适用于我们所有的 JSON 数据类型,除了一种。用户可以从他们的移动设备发送检查结果。检查结果由 ASP.NET Web API 服务作为 JSON 接收。

我有用 C# 编写的单元测试,能够毫无问题地发送检查 JSON 数据。但是,每当我从网页发送数据时,发送的 JSON 数据似乎都会被截断。

这是发送的内容。

{"Formname":"inspection","Formdata":{"UserId":1011357,"InspectionId":40013,"VehicleReg":"AA123ABC","Results":[{"QuestionId":100053,"OptionId":30192,"OptionResponse":"fantastic"}]},"Profile":{"EmailAddress":"myname@mycompany.com","OscarId":"1011369"}};

这是收到的。

{"Formname":"inspection","Formdata":{"UserId":1011357,"InspectionId":40013,"VehicleReg":"AA123ABC","Results":[{"QuestionId":100053,"OptionId":30192,"OptionResponse":"fantastic"

它的长度被截断为 254。

这是创建请求的 AJAX。

var url = "http://mywebservice/api/routingtasks?formname=inspection";

        $.ajax({
            type: "POST",
            url: url,
            contentType: "application/json",
            headers: { "Authorization" : "TESTUSER " + signedToken},
            data: JSON.stringify(formdata),
            success: function(data){
                alert("Task successfully processed.");
            },
            error: function(error){
                alert("error: " + JSON.stringify(error));
            }
        })

接收 JSON 数据的 Web API 控制器的签名是这样的。

public HttpResponseMessage RoutePostData(string formname, [FromBody] JToken postdata)

我的 C# 单元测试能够毫无问题地发送相同的 JSON 数据,但从网页发送 JSON 数据会导致问题。

【问题讨论】:

  • 截断长度可能暗示一个答案,因为 254 不是随机数(字节)。您的应用程序设置中是否有可能限制发送缓冲区大小?
  • 我看到254这个数字也是这么想的。看起来是这样的,但我不知道什么设置会影响JSON的大小。

标签: c# asp.net json ajax asp.net-web-api


【解决方案1】:

如果formdata已经是javascript对象,则不需要stringify它。

$.ajax({
            type: "POST",
            url: url,
            contentType: "application/json",
            headers: { "Authorization" : "TESTUSER " + signedToken},
            data: formdata,
            success: function(data){
                alert("Task successfully processed.");
            },
            error: function(error){
                alert("error: " + JSON.stringify(error));
            }
        })

您可以在文档页面上阅读更多内容:http://api.jquery.com/jQuery.ajax/

【讨论】:

    【解决方案2】:

    你的 json 是错误的。 “个人资料”:{“EmailAddress”大括号缺失。不确定是复制粘贴错误还是您的代码错误。然而它在美妙之后立即被截断。

    把你的json改成

    {"Formname":"inspection","Formdata":{"UserId":1011357,"InspectionId":40013,"VehicleReg":"AA123ABC","Results":[{"QuestionId":100053,"OptionId":30192,"OptionResponse":"fantastic"}]},"Profile":{"EmailAddress":"myname@mycompany.com","OscarId":"1011369"}}
    

    【讨论】:

    • 你能检查一下http post请求正文吗?发送什么?您可以使用 fiddler 或浏览器 devtool 网络来检查在线发送的确切有效负载。只是为了交叉检查,如果有任何东西在客户端截断请求正文。因为您的内容长度无论如何都是 250。内容长度:250
    • 根据 Fiddler 的说法,整个 JSON 有效负载正在被发送
    【解决方案3】:

    试试这个:

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

    将值设置为您选择的值。

    【讨论】:

    • 此值是否会影响通过 HTTP 请求传入数据的反序列化?还是只影响在代码中手动反序列化的数据?
    • 如果您使用 JavaScriptSerializer 类,则适用。
    • 这不会有任何影响。似乎是 HTTP 请求截断了 JSON,因为我可以毫无问题地从 C# 单元测试中发出完全相同的请求。所以问题一定是网络/浏览器/AJAX是如何构成请求的。
    • 谁知道呢。但是,这种行为在您的单元测试而不是在应用程序本身上起作用的地方通常与某些环境差异有关。你试过了吗?很简单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 2020-03-21
    • 1970-01-01
    相关资源
    最近更新 更多