仅当 return 类型为 IQueryable 时,Azure MobileApp 控制器 returns 500
Azure MobileApp Controller returns 500 only if return type is IQueryable
我的 Azure 移动应用程序后端出现异常行为。
如果我的控制器操作 return 是 IQueryable<T>
并且实体类型具有导航 属性,它 return 是 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
操作开始 return 500,带有通用消息
"An error has occurred."
此外,当我请求操作时,Azure Logs 显示以下异常:
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
修饰模型的 Brand
属性 时,Brand
属性 被忽略,一切正常
2) 当我将动作 return 类型更改为 List<ProductHierarchy>
时,保持模型的 Brand
属性 没有 JsonIgnore
属性,一切也很好用。
这让我得出结论,当 T
有一个 属性 类型为另一个实体时,问题发生在序列化 IQueryable<T>
时。
我没有发现任何人有同样的问题,所以我开始查看我的 nuget 包以寻找 wich 包 Works 或与序列化过程交互,我的怀疑遍布 Newtonsoft Json 和AutoMapper.
有人知道如何深入了解这些软件包并确定问题的根源吗?
关系中存在很多问题和边缘案例。你遇到问题我并不感到惊讶。
部分资源:
我的 Azure 移动应用程序后端出现异常行为。
如果我的控制器操作 return 是 IQueryable<T>
并且实体类型具有导航 属性,它 return 是 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
操作开始 return 500,带有通用消息
"An error has occurred."
此外,当我请求操作时,Azure Logs 显示以下异常:
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
修饰模型的 Brand
属性 时,Brand
属性 被忽略,一切正常
2) 当我将动作 return 类型更改为 List<ProductHierarchy>
时,保持模型的 Brand
属性 没有 JsonIgnore
属性,一切也很好用。
这让我得出结论,当 T
有一个 属性 类型为另一个实体时,问题发生在序列化 IQueryable<T>
时。
我没有发现任何人有同样的问题,所以我开始查看我的 nuget 包以寻找 wich 包 Works 或与序列化过程交互,我的怀疑遍布 Newtonsoft Json 和AutoMapper.
有人知道如何深入了解这些软件包并确定问题的根源吗?
关系中存在很多问题和边缘案例。你遇到问题我并不感到惊讶。
部分资源: