WEB API 在离开 ApiController 方法后挂起

WEB API hangs after leaving ApiController method

我的应用程序是使用 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,我可以检查我的 API Web 中控制器的 Get 方法 API。

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

它奏效了但正在尝试

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

使 Web API 永远挂起,而 w3wp.exe 的内存使用量不断上升。所以我最终不得不终止 w3wp.exe 进程。此外,通过在 GET 方法内部设置断点,我确保在获取正确数据并离开方法后发生挂起。

我该如何处理此类问题?

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

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

我认为您的解决方案不正确。相反,您可能希望有一个模型来查看模型结构,其中视图模型对象是平面的并且仅公开您想要的属性:

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。