我的天蓝色移动应用程序后端呈现出一种奇怪的行为.
如果我的控制器动作返回IQueryable< T>并且实体类型具有导航属性,它返回500.
一个简单的例子:
模型
public class ProductHierarchy : EntityData
{
public string Name { get; set; }
public string Description { get; set; }
public DateTime ValidFrom { get; set; }
public DateTime ValidTo { get; set; }
public string BrandId{ get; set; }
[ForeignKey("BrandId")]
public virtual Brand Brand { get; set; }
public ProductStatus Status { get; set; }
public int CreatedBy { get; set; }
public int ModifiedBy { get; set; }
}
控制器动作
[HttpGet]
[Route("api/ProductHierarchies/FromBrand/{brandId}")]
public IQueryable<ProductHierarchy> FromBrand(int brandId)
{
var hierarchies = Query().Where(hi => hi.Brand.OldBrandId ==brandId);
return hierarchies;
}
当我对此操作发出请求时,解决方案在我的本地计算机上运行,一切正常,但是当我将解决方案发布到azure时,FromBrand操作开始返回500,带有通用消息
"An error has occurred."
此外,当我向操作发出请求时,Azure日志会向我显示以下异常:
Detailed Error Information: Module
__DynamicModule_Microsoft.Owin.Host.SystemWeb.OwinHttpModule,Microsoft.Owin.Host .SystemWeb, Version=3.0.1.0, Culture=neutral,PublicKeyToken=31bf3856ad364e35_19e9f0a3-023d-4d8b-83ef- 180a415e7921 Notification PreExecuteRequestHandler Handler ExtensionlessUrlHandler-Integrated-4.0 Error Code 0x00000000
我发现了两个可以避免错误的更改:
1)当我用JsonIgnore装饰Model的Brand属性时,Brand属性被忽略,一切正常
2)当我将动作返回类型更改为List< ProductHierarchy>时,保留模型的Brand属性而不使用JsonIgnore属性,一切正常.
这让我得出结论,问题正在发生,序列化IQueryable< T>当T具有另一个实体作为类型的属性时.
我没有发现任何人有同样的问题,所以我开始查看我的nuget包,寻找与序列化过程中的工具包或Interact,我怀疑的是Newtonsoft Json和AutoMapper.
任何人都有一些关于如何查看这些包的内幕并确定问题根源的线索?
最佳答案 关系中存在许多问题和边缘情况.你碰到了一个问题我并不感到惊讶.
一些资源:
>这本书 – http://aka.ms/zumobook(特别是第3章)
>关系博客:
https://shellmonger.com/2016/05/27/30-days-of-zumo-v2-azure-mobile-apps-day-26-relationship-advice/