仅当返回类型为 IQueryable 时,Azure MobileApp 控制器才返回 500

问题描述 投票:0回答:1

我的天蓝色移动应用程序后端呈现出奇怪的行为。 如果我的控制器操作返回

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,并带有通用消息

“发生错误。”

此外,当我向操作发出请求时,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. 当我用

    Brand
    装饰模型的
    JsonIgnore
    属性时,
    Brand
    属性被忽略,一切正常

  2. 当我将操作返回类型更改为

    List<ProductHierarchy>
    时,保留模型的
    Brand
    属性而不使用
    JsonIgnore
    属性,一切也都正常。

这让我得出结论,当

IQueryable<T>
具有另一个实体作为类型的属性时,问题发生在序列化
T
上。

我没有发现任何人有同样的问题,所以我开始研究我的 nuget 包,寻找哪个包可以工作或与序列化过程交互,我的怀疑遍布 Newtonsoft JSON 和 AutoMapper。

有人知道如何查看这些软件包的内部情况并确定问题的根源吗?

c# azure azure-mobile-services iqueryable http-status-code-500
1个回答
2
投票

人际关系存在很多问题和边缘情况。 您遇到问题我并不感到惊讶。

一些资源:

  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/
© www.soinside.com 2019 - 2024. All rights reserved.