我知道有关此问题有很多问题。但是我无法解决我的问题。
API流
代码
下面是我的代码
public HttpResponseMessage GetDetails(string msn, DateTime dt)
{
try
{
var prodDetails = mdcEntitites.tj_xhqd.Where(m => m.sjsj >= dt)
.Select(x => new { MSN = x.zdjh, PingDateTime = x.sjsj, PingValue = x.xhqd })
.ToList();
var mainDetails = kesc.tj_xhqd.Where(m => m.sjsj >= dt)
.Select(x => new { MSN = x.zdjh,PingDateTime= x.sjsj,PingValue = x.xhqd })
.ToList();
var res = prodDetails.Concat(mainDetails).ToList();
return Request.CreateResponse(HttpStatusCode.OK, new {details = res });
}
catch (Exception ex)
{
return Request.CreateErrorResponse(HttpStatusCode.NotFound, ex);
}
}
在上述通话中,我接受日期时间。将仪表发送给现场人员时,系统会在系统中标记日期时间,因此上述日期为该日期时间。
它将在该日期时间之后搜索该序列号的所有记录。
错误
当我尝试使用当前日期时间运行API时,使用Postman
会给我带来以下结果
{
"details": [
{
"MSN": "002998002523",
"PingDateTime": "2018-06-21T08:38:12",
"PingValue": "26"
},
{
"MSN": "002998001286",
"PingDateTime": "2018-06-21T08:38:13",
"PingValue": "18"
},
.
.
.
.
.
]
}
但是,当我尝试以小于当前日期时间的日期时间运行API时,它给出了以下异常信息
引发了类型为'System.OutOfMemoryException'的异常。
描述:在执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪,以获取有关错误及其在代码中起源的更多信息。
异常详细信息:System.OutOfMemoryException:引发了类型为'System.OutOfMemoryException'的异常。
源错误:
在执行当前Web请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来标识有关异常的来源和位置的信息。
堆栈跟踪:
[OutOfMemoryException:引发了类型为'System.OutOfMemoryException'的异常。] System.IO.MemoryStream.set_Capacity(Int32值)+89 System.IO.MemoryStream.EnsureCapacity(Int32值)+90 System.IO.MemoryStream.Write(Byte []缓冲区,Int32偏移量,Int32计数)+326 Microsoft.VisualStudio.Web.PageInspector.Runtime.Tracing.ArteryFilter.Write(Byte []缓冲区,Int32偏移量,Int32计数)+62 System.Web.HttpWriter.FilterIntegrated(布尔型finalFiltering,IIS7WorkerRequest wr)+9746340 System.Web.HttpResponse.FilterOutput()+104 System.Web.CallFilterExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+58 System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep步骤)+48 System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤,布尔值并已完成同步)+71
如何摆脱这个问题?
任何帮助将不胜感激。
答案 0 :(得分:1)
正如dlxeon指出的,the PageInspector
might be the cause of your exception。但是,无论如何,您都有潜在的问题:您没有限制要返回的搜索结果的数量,并且将来随着数据库的增长,这可能会成为问题。您可以这样做:
在page
之后,向您的API调用添加可选的.Skip((page-1)*PageSize).Take(PageSize)
参数,并向数据库查询中添加类似.Where
的内容。假设页面从1开始,并且您定义了PageSize
常量。 1
根据客户需要在您的响应中包含分页信息,例如:
{ "pageSize": 10, "currentPage": 1, "details: "[ ... ] }
1 在您的情况下,由于您要执行两个数据库查询,所以会有些复杂,但是您知道了。