AJAX post 到 webmethod returns 内部服务器错误 500 只有大量的行

AJAX post to webmethod returns internal server error 500 only with large number of rows

我有一个 VB.Net 网络方法,它仅在返回的行数增加时抛出非描述性 500 "error processing the request"。在方法中调试,我看不到服务器端抛出任何错误。但是,如果我使用 Fiddler 重新发出命令,则会显示相同的错误,因此我认为这不是我的 AJAX 调用,而是我的 webmethod。在这一点上,我不确定如何获得有关该错误的更多详细信息,因为服务器代码没有抛出错误。

Web 方法运行 SQL 查询,然后调用函数将结果格式化为 HTML table 格式。 HTML table 稍后添加到使用 DataTables 进行格式设置的页面。它适用于 50 或行但大约 100 行时会抛出错误。我可以验证这一点,因为第一个查询 returns 提供的每个输入参数 1 行允许我测试 50、75 和 100 行,直到我发现错误。

此时我不确定如何调试它。我看不到如何获得有关可能原因的更多详细信息。

    <System.Web.Services.WebMethod()> _
<ScriptMethod(ResponseFormat:=ResponseFormat.Json)> _
Public Shared Function GetReportData2(ByVal sRptId As String, ByVal sParms1 As String, ByVal sParms2 As String) As String
    'for some reason the parms on the screen come in with spaces as dividers
    sParms1 = sParms1.Replace(" ", ",").Replace(vbCr, ",").Replace(vbLf, ",")
    sParms2 = sParms2.Replace(" ", ",").Replace(vbCr, ",").Replace(vbLf, ",")
    Dim dt = New DataTable()

    Try
        Select Case sRptId
            Case "1"
                Using conn = New SqlConnection(ConfigurationManager.ConnectionStrings("DirectoryInfoConnectionString").ConnectionString)
                    Using cmd = New SqlCommand("s_rpt_BatchLookup_People", conn)
                        cmd.CommandType = CommandType.StoredProcedure
                        'set timeout to 60s
                        cmd.CommandTimeout = 60
                        cmd.Parameters.Add("@input", SqlDbType.VarChar, -1).Value = sParms1
                        Using adapter = New SqlDataAdapter(cmd)
                            adapter.Fill(dt)
                        End Using
                    End Using
                End Using
            Case "2"
                Using conn = New SqlConnection(ConfigurationManager.ConnectionStrings("DirectoryInfoConnectionString").ConnectionString)
                    Using cmd = New SqlCommand("s_rpt_BatchLookup_Client_Detail", conn)
                        cmd.CommandType = CommandType.StoredProcedure
                        'set timeout to 120s
                        cmd.CommandTimeout = 120
                        cmd.Parameters.Add("@input", SqlDbType.VarChar, -1).Value = sParms1
                        cmd.Parameters.Add("@cym", SqlDbType.VarChar, -1).Value = sParms2
                        Using adapter = New SqlDataAdapter(cmd)
                            adapter.Fill(dt)
                        End Using
                    End Using
                End Using
            Case Else
        End Select

        Return ConvertToHtmlFile2(dt)

    Catch ex As Exception
        Return ex.Message + ex.InnerException.ToString()
    End Try


End Function

    Public Shared Function ConvertToHtmlFile2(ByVal targetTable As DataTable) As String
    Dim myHtmlFile As String = ""
    If (targetTable Is Nothing) Then
        Throw New System.ArgumentNullException("targetTable")
    Else
        'Continue.
    End If
    Dim myBuilder As System.Text.StringBuilder = New System.Text.StringBuilder()
    myBuilder.Append("<thead><tr>")
    For Each myColumn As DataColumn In targetTable.Columns
        myBuilder.Append("<th>")
        myBuilder.Append(myColumn.ColumnName)
        myBuilder.Append("</th>")
    Next myColumn
    myBuilder.Append("</tr></thead>")
    'add body
    myBuilder.Append("<tbody>")
    'Add the data rows.
    For Each myRow As DataRow In targetTable.Rows
        myBuilder.Append("<tr>")
        For Each myColumn As DataColumn In targetTable.Columns
            myBuilder.Append("<td>")
            myBuilder.Append(myRow(myColumn.ColumnName).ToString())
            myBuilder.Append("</td>")
        Next myColumn
        myBuilder.Append("</tr>")
    Next myRow
    'Close tags.
    myBuilder.Append("</tbody>")
    'Get the string for return.
    myHtmlFile = myBuilder.ToString()
    Return myHtmlFile
End Function

这是来自 Fiddler 的原始错误数据。我认为这不会有帮助。

    HTTP/1.1 500 Internal Server Error
Server: ASP.NET Development Server/11.0.0.0
Date: Sun, 13 Sep 2015 20:23:55 GMT
X-AspNet-Version: 4.0.30319
jsonerror: true
Cache-Control: private
Content-Type: application/json; charset=utf-8
Content-Length: 91
Connection: Close

{"Message":"There was an error processing the request.","StackTrace":"","ExceptionType":""}

更新 1 我将 webmethod 移动到一个单独的 asmx 文件以进行更多测试。我还创建了一个简单的查询 select 来自 table 的 X 行数。 "internal server error 500" 再次仅在行数超过特定限制时发生。 但是运行 asmx 直接不会抛出同样的错误。只有 AJAX POST 请求似乎会导致错误,因为行数超过了某个限制。

我读到的所有内容都说这必须是服务器端,但如果我隔离 asmx 文件,它一切正常。我看不出 AJAX post 调用在特定行数后导致错误的原因。

这最终成为 web.config 中未设置 maxJsonLength 的问题。由于 customError 模式处于打开状态,我没有收到消息。不知道为什么,但在 web 方法本身中设置最大值也无济于事。但是我读过其他帖子说它必须在网络方法中完成。最后这很难找到,因为 AJAX 调用的错误部分在 responseText 字段中没有详细消息告诉我错误的详细信息。

有关错误消息如何丢失的更多详细信息,请参阅this post on customError mode and AJAX responseText