有点奇怪,所以我希望有人可以提供帮助。我在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只是“触摸”的行而不是实际返回的行数...这只是一个红色的鲱鱼?