只有当返回类型为IQueryable时,Azure MobileApp Controller才返回500

本文关键字:MobileApp Azure Controller 返回 返回类型 IQueryable | 更新日期: 2023-09-27 18:18:23

我的azure移动应用程序后端呈现奇怪的行为。如果我的控制器动作返回一个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修饰模型的Brand属性时,Brand属性被忽略,一切工作正常

2)当我将动作返回类型更改为List<ProductHierarchy>时,保留模型的Brand属性而没有JsonIgnore属性,一切都工作得很好。

它使我得出结论,当T具有另一个实体作为类型的属性时,问题发生在序列化IQueryable<T>时。

我没有发现任何人有同样的问题,所以我开始查看我的nuget包寻找哪个包工作或与序列化过程交互,我的怀疑都在Newtonsoft Json和AutoMapper。

有谁知道如何查看这些包的内部并确定问题的根源吗?

只有当返回类型为IQueryable时,Azure MobileApp Controller才返回500

关系中有很多问题和边缘情况。你遇到这样的问题我一点也不惊讶。

一些资源:

  1. 书- http://aka.ms/zumobook(特别是第3章)
  2. 人际关系博客:https://shellmonger.com/2016/05/27/30-days-of-zumo-v2-azure-mobile-apps-day-26-relationship-advice/