我的应用程序是使用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方法中创建断点,我确保在获取正确的数据并离开方法后发生挂起。
我该如何处理这类问题?
答案 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。