【问题标题】:Web API system out of memory exceptionWeb API 系统内存不足异常
【发布时间】:2018-06-21 09:23:13
【问题描述】:

我知道有很多关于这个问题的问题。但我无法解决我的问题。

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[] buffer, Int32 offset, Int32 count) +326 Microsoft.VisualStudio.Web.PageInspector.Runtime.Tracing.ArteryFilter.Write(Byte[] buffer, Int32 offset, Int32 count) +62 System.Web.HttpWriter.FilterIntegrated(Boolean finalFiltering, IIS7WorkerRequest WR) +9746340 System.Web.HttpResponse.FilterOutput() +104 System.Web.CallFilterExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +58 System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step) +48 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +71

我怎样才能摆脱这个问题?

任何帮助将不胜感激。

【问题讨论】:

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


【解决方案1】:

正如 dlxeon 指出的那样,the PageInspector might be the cause of your exception。但是,无论如何您都有一个潜在的问题:您没有限制您返回的搜索结果的数量,当您的数据库增长时,这可能是未来的一个问题。你可以这样做:

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

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

{ “页面大小”:10, “当前页面”:1, “细节: ”[ ... ] }

1在你的情况下,它会有点复杂,因为你正在做两个数据库查询,但你明白了。

【讨论】:

  • Page 和 Pagesize 是变量?
  • page 可选地与请求一起提供,默认为 1。PageSize 可以是服务器中的硬编码值,也可以是客户端提供的具有合理默认值的参数。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-15
  • 1970-01-01
  • 2015-06-18
  • 2018-06-23
  • 1970-01-01
  • 2018-12-10
相关资源
最近更新 更多