Request.Result 中的字符串在 MVC 5 中被截断

Posted

技术标签:

【中文标题】Request.Result 中的字符串在 MVC 5 中被截断【英文标题】:string in Request.Result is Truncated in 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 正在做的参数绑定有问题。

【问题讨论】:

【参考方案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);

【讨论】:

知道为什么会这样吗?不得不这样做似乎是一种肮脏的解决方法

以上是关于Request.Result 中的字符串在 MVC 5 中被截断的主要内容,如果未能解决你的问题,请参考以下文章

MVC5 中的授权/角色

如何在 MVC 5 中使用用户身份中的角色

用于替换 ASP.net MVC 中的连接字符串的 aws 环境变量

如何限制 MVC 中文本框中的字符长度?

将 MVC 4 视图中的 html 转换为字符串

将 MVC 视图呈现为 Parallel.ForEach 中的字符串时的依赖注入问题