Web API系统内存不足异常

时间:2018-06-21 09:23:14

标签: c# .net exception asp.net-web-api

我知道有关此问题有很多问题。但是我无法解决我的问题。

API流

  1. 它接受两个参数:仪表序列号和日期时间。
  2. 传递参​​数后,将进行API调用
  3. API将在两个数据库中搜索发送的仪表序列号。
  4. 获取记录后,它应该提供输出。

代码

下面是我的代码

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

如何摆脱这个问题?

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

正如dlxeon指出的,the PageInspector might be the cause of your exception。但是,无论如何,您都有潜在的问题:您没有限制要返回的搜索结果的数量,并且将来随着数据库的增长,这可能会成为问题。您可以这样做:

  1. page之后,向您的API调用添加可选的.Skip((page-1)*PageSize).Take(PageSize)参数,并向数据库查询中添加类似.Where的内容。假设页面从1开始,并且您定义了PageSize常量。 1

  2. 根据客户需要在您的响应中包含分页信息,例如:

{
  "pageSize": 10,
  "currentPage": 1,
  "details: "[
    ...
  ]
}

1 在您的情况下,由于您要执行两个数据库查询,所以会有些复杂,但是您知道了。