【问题标题】:AJAX post to webmethod returns internal server error 500 only with large number of rowsAJAX 发布到 webmethod 仅返回内部服务器错误 500 与大量行
【发布时间】:2015-12-09 19:53:17
【问题描述】:

我有一个 VB.Net webmethod,当返回的行数增加时,它只会抛出一个非描述性的 500“错误处理请求”。在方法中调试,我看不到服务器端抛出任何错误。但是,如果我使用 Fiddler 重新发出命令,则会显示相同的错误,所以我认为这不是我的 AJAX 调用,而是我的 webmethod。在这一点上,我不确定如何获取有关错误的更多详细信息,因为服务器代码没有引发错误。

Web 方法运行 SQL 查询,然后调用函数以 HTML 表格格式格式化结果。 HTML 表稍后会添加到使用 DataTables 进行格式化的页面中。它适用于 50 或行,但大约 100 行会引发错误。我可以验证这一点,因为第一个查询返回每个提供的输入参数 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 文件以进行更多测试。我还创建了一个简单的查询来从表中选择 X 行。再次,“内部服务器错误 500”仅在行数超过某个限制时发生。 但是直接运行 asmx 不会抛出同样的错误。只有 AJAX POST 请求似乎会导致错误,因为行数超过了某些限制。

我读到的所有内容都说这必须是服务器端的,但如果我隔离 asmx 文件,一切正常。我看不出 AJAX post call 有什么问题会在一定数量的行后导致错误。

【问题讨论】:

    标签: json ajax vb.net webmethod


    【解决方案1】:

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

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

    【讨论】:

    • 您能否发布 web.config 设置以清楚说明?
    猜你喜欢
    • 1970-01-01
    • 2019-05-24
    • 2016-09-16
    • 1970-01-01
    • 2015-07-21
    • 2017-06-27
    • 2016-06-19
    • 1970-01-01
    • 2014-07-02
    相关资源
    最近更新 更多