离开ApiController方法后,WEB API挂起

时间:2015-02-19 18:59:44

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

我的应用程序是使用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;
    }

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

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

它有效但尝试

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

使w3wp.exe的内存使用率持续上升时,Web API将永久挂起。所以我不得不最终杀死w3wp.exe进程。此外,通过在GET方法中创建断点,我确保在获取正确的数据并离开方法后发生挂起。

我该如何处理这类问题?

2 个答案:

答案 0 :(得分:1)

我应该早点发现这个原因。这是Json序列化中的一个问题。如果实体具有许多相关记录,则需要永久地序列化实体的导航属性。当然,忘记禁用延迟加载是我的错。添加以下代码解决了这个问题。

public MachinesController()
{
    db.ContextOptions.LazyLoadingEnabled = false;
}

答案 1 :(得分: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。