离开ApiController方法后,WEB API挂起

3

我的应用程序是使用ASP.NET MVC 4和Web API构建的。但我有一个奇怪的问题要分享。

相关代码如下:

public class MachinesController : ApiController
{
    private GWData db = new GWData();

    // GET api/Machines/5
    public Machine GetMachine(int id)
    {
        Machine machine = db.Machines.Single(m => m.Id == id);
        if (machine == null)
        {
            throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
        }

        return machine;
    }

使用以下网址,我可以检查Web API控制器中的API Get方法。

 http://localhost/myweb/api/machines/1

它可以工作,但是尝试一下

 http://localhost/myweb/api/machines/2

当内存使用量不断增加时,使Web API永远挂起。因此,我最终不得不杀死w3wp.exe进程。通过在GET方法内设置断点,我进一步确保挂起发生在获取正确数据并离开该方法之后。

我该如何解决这种问题?

2个回答

1
我应该更早地发现这个问题。这是Json序列化的一个问题。如果实体具有许多相关记录,则序列化导航属性需要很长时间。当然,我的错是忘记禁用延迟加载。添加以下代码解决了问题。
public MachinesController()
{
    db.ContextOptions.LazyLoadingEnabled = false;
}

1
我认为你的解决方案不正确。相反,你可能需要一个模型来查看模型结构,其中视图模型对象是平面的,并且仅公开你想要的属性:
class Order
{
    // properties you want to expose

    public DateTime OrderDate { get; set; }

    // navigation and other properties you don't want to expose

    public Guid OrderId { get; set; }

    public Customer Customer { get; set; }

    public ICollection<Address> Addresses { get; set; }

    public ICollection<Tax> Taxes { get; set; }
}

class OrderViewModel
{
    public DateTime OrderDate { get; set; }
}

使用AutoMapper是从一个对象创建另一个对象最简单的方法。

我同意你的观点,但我不确定“正确”是否是一个合适的词。由于我的项目时间紧迫,而这个实体在系统中并不关键,所以我只使用了原始实体而没有建立模型来获取数据。无论如何,感谢分享这些信息。 - Tae-Sung Shin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接