【问题标题】:string in Request.Result is Truncated in MVC 5Request.Result 中的字符串在 MVC 5 中被截断
【发布时间】:2014-08-20 03:37:45
【问题描述】:

我有一个 WebApi 控制器和一个使用 ajax 调用该视图的视图。

直到昨天一切都很好,但是现在,我运行了这个项目,传输的数据被截断了。 示例如下:

这是我的 AjAx 调用:

var data = JSON.stringify(aoData);
oSettings.jqXHR = $.ajax({
    "dataType": 'json',
    "type": "POST",
    "url": sSource,
    "data": data,
    "success": fnCallback,
    "contentType": 'application/json'
});

这是我的控制器:

public object GetAllProductsForDataTable(DataTableRequestItem[] pRequest)
{
    ...
}

发送前的数据是正确的。它完成了,但是我的控制器在参数上收到了一个 NULL 值,所以我检查了收到的请求数据,发现 json 字符串被截断了。 我通过从控制器调用 Request.Content.ReadAsStringAsync().Result 得到这样的结果:

alue\":false},{\"name\":\"bSearchable_5\",\"value\":true}

实际的 JSON 值要长得多,但这只是它的开始,因此您可以看到它被截断了。

检查值的长度是 1393,所以我认为它的长度可能有问题,但无法弄清楚。

更新

检查截断值的长度,我看到是 369... 这应该给出一些提示,因为对象的总长度减去读取值的总长度......是 1024......

一定有什么东西在发出从 char 1024 读取的请求

更新 2

我将控制器操作更改为接收 HttpRequestMessage 而不是我的对象,并且使用 ReadAsStringAsync().Result 的结果返回 FULL 字符串。 我猜 MVC 正在做的参数绑定有问题。

【问题讨论】:

    标签: ajax json asp.net-mvc-5


    【解决方案1】:

    只有当我提供无法反序列化为控制器方法参数类型的 JSON 时,我才能重现此问题。如果Json无法解析成参数类型,调用Request.Content.ReadAsStringAsync()时会截断payload的前1024个字符

    在您的情况下,这意味着发送给您的 api 的 Json 与 DataTableRequestItem[] 不匹配。您应该仔细检查您发送的 JSON。

    要弄清楚你的错误是什么,你应该检查你的控制器的ModelStateModelState.IsValid 可能返回 false。您可以在ModelState.Values 中看到错误。

    如果您希望在任何 api 控制器上提供无效 JSON 而不到达控制器方法时返回 BadRequest,您可以添加 ActionFilterAttribute,如 in this Microsoft documentation 所述。这将确保您的客户端收到正确的错误消息,并防止长时间调试会话以了解晦涩的行为。

    【讨论】:

      【解决方案2】:

      即使“客户端”部分完全不同(没有 Ajax 而是 kt/Android 调用),我也遇到了同样的问题,我确认这段代码的结果给出了一个截断的字符串:

          [HttpPost]
          [BasicAuthentication]
          public HttpResponseMessage Send([FromBody]string json)
          {
              string str = Request.Content.ReadAsStringAsync().Result;
      
              return Request.CreateResponse(HttpStatusCode.OK);
          }
      

      以下代码返回完整的字符串

      [HttpPost]
      [BasicAuthentication]
      public HttpResponseMessage Send(HttpRequestMessage req)
      {
          string str = req.Content.ReadAsStringAsync().Result;
      
          return Request.CreateResponse(HttpStatusCode.OK);
      }
      

      【讨论】:

      • 知道为什么会这样吗?不得不这样做似乎是一种肮脏的解决方法
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-05
      • 1970-01-01
      • 1970-01-01
      • 2016-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多