为什么我的ajax帖子会被截断?

tyl*_*ell 14 c# iis ajax jquery knockout.js

我刚刚更新了我的mvc服务,包括更大的错误和日志记录.我现在有几次这个确切的错误.但无法复制.

Unterminated string. Expected delimiter: ". Path 'Breadcrumbs[18].Params', line 1, position 59740. at Newtonsoft.Json.JsonTextReader.ReadStringIntoBuffer(Char quote) at 
Run Code Online (Sandbox Code Playgroud)

每次路径都不同,具体取决于用户发送到服务器的内容.

我的ajax请求通常如下所示:

$.ajax(myURL("SendBreadcrumbs"), {
            type: "POST",
            cache: false,
            data: { telemetry: telemetry.JSONify(), userID: currentUser, isMyVI: isMyVI }
        })
Run Code Online (Sandbox Code Playgroud)

在这些情况下,userID和isMyVI(布尔值)不存在,并且遥测字符串被截断.

JSONify方法如下:

self.JSONify = function () {
    var data = ko.mapping.toJSON(self, TelemetryMapping);
    return data;
}
Run Code Online (Sandbox Code Playgroud)

这是knockoutJSs序列化器.

服务器端:

public void SendBreadcrumbs(string telemetry, string userID = null, bool isMyVI = true)
{
    MyServiceAudit audit;
    Guid UserID;
    if (Guid.TryParse(userID, out UserID))
        audit = InsertAudit(UserID);
    else
        audit = InsertAudit(null);
    try
    {
        Models.Telemetry data = JsonConvert.DeserializeObject<Models.Telemetry>(telemetry);
        Controllers.Telemetry.UpdateTelemetry(data, isMyVI);
    }
    catch (Exception ex)
    {
         MyServiceAuditDB.FailAudit(audit.ID, ex.Message + " " + ex.StackTrace);
    }
}
Run Code Online (Sandbox Code Playgroud)

我完全难过,我已经尝试更新服务器上的web.config更大的maxvalues等,看到它在那边截断.

我在ajax中唯一的另一个区别是全局超时3分钟.

这是否像在客户端没有处理的特殊字符或服务器端限制一样简单,或者数据如此之大以至于它被分块并且服务器端不知道等待下一个块?

tyl*_*ell 2

在一些评论、答案和最终获得实时失败数据的帮助下,我能够解决这个问题。

事实证明,用户不仅使用了特殊字符,而且发送下来的一些静态数据也包含了这个(GIGO - 无法相信我们的一些数据的状态)。

客户端解决方案:

encodeURIComponent() 函数对 URI 组件进行编码。该函数对特殊字符进行编码。此外,它还对以下字符进行编码: , / ? :@&=+$#

$.ajax(myURL("SendBreadcrumbs"), {
        type: "POST",
        cache: false,
        data: { telemetry: encodeURIComponent(telemetry.JSONify()), userID: currentUser, isMyVI: isMyVI }
    })
Run Code Online (Sandbox Code Playgroud)

服务器端解决方案:

将字符串转换为其未转义的表示形式。Uri.UnescapeDataString()

public void SendBreadcrumbs(string telemetry, string userID = null, bool isMyVI = true)
{
    MyServiceAudit audit;
    Guid UserID;
    if (Guid.TryParse(userID, out UserID))
        audit = InsertAudit(UserID);
    else
        audit = InsertAudit(null);
    try
    {
        Models.Telemetry data = JsonConvert.DeserializeObject<Models.Telemetry>(Uri.UnescapeDataString(telemetry));
        Controllers.Telemetry.UpdateTelemetry(data, isMyVI);
    }
    catch (Exception ex)
    {
         MyServiceAuditDB.FailAudit(audit.ID, ex.Message + " " + ex.StackTrace);
    }
}
Run Code Online (Sandbox Code Playgroud)

网络应用程序配置:

我的一位用户由于尝试发送 20 封电子邮件而收到 500 错误。我更新了配置以包括最大请求长度(以千字节为单位,示例为 1GB)和最大内容长度(以字节为单位,示例为 1GB)。电子邮件没有任何问题。简直不敢相信!

<appSettings>
    <add key="aspnet:MaxJsonDeserializerMembers" value="150000" />
</appSettings>
<system.web>
    <httpRuntime targetFramework="4.5" maxQueryStringLength="32768" maxUrlLength="65536" maxRequestLength="1048576" />
</system.web>
<system.webServer>
    <security>
        <requestFiltering>
            <requestLimits maxQueryString="32768" maxAllowedContentLength="1073741824"  />
        </requestFiltering>
    </security>
</system.webServer>
<system.web.extensions>
    <scripting>
        <webServices>
            <jsonSerialization maxJsonLength="2147483647" />
        </webServices>
    </scripting>
</system.web.extensions>
Run Code Online (Sandbox Code Playgroud)