WebMethod响应标头是500内部服务器错误,但响应正文包含预期数据

时间:2016-08-09 14:57:23

标签: c# asp.net webmethod

有点奇怪,所以我希望有人可以提供帮助。我在ASMX文件中运行了一个c#WebMethod。我通过JQuery $ ajax从另一个应用程序调用此方法。

asmx在最大json长度设置为int32限制的Web应用程序中运行。

我会说1/50左右的请求导致我的错误函数(ajax错误函数)被运行,因为来自服务器的响应带来了以下内容:

Key Value
Response    HTTP/1.1 500 Internal Server Error
Cache-Control   private
Content-Type    application/json; charset=utf-8
Server  Microsoft-IIS/8.5
jsonerror   true
X-AspNet-Version    4.0.30319
X-Powered-By    ASP.NET
Access-Control-Allow-Origin *
Access-Control-Allow-Headers    Content-Type
Access-Control-Allow-Methods    GET, POST, PUT, DELETE, OPTIONS
Date    Tue, 09 Aug 2016 14:25:11 GMT
Content-Length  91

但是,如果我然后查看响应正文,则返回完整形成的完整json对象。

正如我所说的49/50次,该方法返回200,其中相同的数据在500时可见,任何人都有任何想法,我可以开始调查为什么它的零星考虑到web方法不参数

WebMethod是:

[WebMethod]
        [ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
        public List<BasicUIN> ReturnBasicUINList()
        {

            try
            {
                return BasicUIN.PopulateBasicUINS(true);

            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        } 

编辑:

只是想在Chrome和Fiddler查看请求之后添加一下,看起来Internet Explorer Network标签一直在骗我!响应正文不包含我预期数据的完整格式列表,而是包含错误消息,但消息和堆栈跟踪都是“”。我已经关闭了自定义错误消息,但是当它生成500时,仍然没有在结果请求中收到堆栈跟踪,只有“处理您的请求时出错”消息。

我有什么想法可以获得完整的错误消息吗?

Update2:我设法获得了完整的错误:

{"Message":"Invalid attempt to read when no data is present.","StackTrace":"   at System.Data.SqlClient.SqlDataReader.CheckDataIsReady(Int32 columnIndex, Boolean allowPartiallyReadColumn, Boolean permitAsync, String methodName)\r\n   at System.Data.SqlClient.SqlDataReader.TryReadColumn(Int32 i, Boolean setTimeout, Boolean allowPartiallyReadColumn)\r\n   at System.Data.SqlClient.SqlDataReader.GetValueInternal(Int32 i)\r\n   at System.Data.SqlClient.SqlDataReader.GetValue(Int32 i)\r\n   at Central.WS.ViewModels.BasicUIN.PopulateBasicUINS(Boolean includeCranfield, Boolean includeArchived)","ExceptionType":"System.InvalidOperationException"}

但是,我不确定每次返回相同数据时的情况如何,填充我的对象的方法是:

 public static List<BasicUIN> PopulateBasicUINS(bool redacted = true, bool includeArchived = false)
        {
            List<BasicUIN> UINList = new List<BasicUIN>();
            SQLDataLayer dal =
                new SQLDataLayer(
                    System.Configuration.ConfigurationManager.ConnectionStrings["xxxx"].ToString());
            dal.AddParameter("redacted", redacted, DbType.Boolean);
            dal.AddParameter("includeArchived", includeArchived, DbType.Boolean);

            IDataReader dreader = dal.GetResultSet("usp_xxxxx", CommandType.StoredProcedure);


            while (dreader.Read())
            {
                BasicUIN uinEntry = new BasicUIN();
                uinEntry.ID = (int) dreader["idRefUIN"];
                uinEntry.Code = dreader["varUIN"].ToString();
                uinEntry.Name = dreader["varDescription"].ToString();
                UINList.Add(uinEntry);
            }

            dreader.Dispose();
            return UINList;
        }

鉴于我只在while循环中填充对象,我有点困惑?

Update4:所以我设法在sql server profiler运行时重新创建问题,看起来当出现错误时,'RowCounts'列显示的是与不出错时相比的不同数字:

通常如此:27194 错误:25928

现在我知道RowCount只是“触摸”的行而不是实际返回的行数...这只是一个红色的鲱鱼?

0 个答案:

没有答案