Azure 移动应用服务器在 GET 上不返回 DBGeography

Posted

技术标签:

【中文标题】Azure 移动应用服务器在 GET 上不返回 DBGeography【英文标题】:Azure Mobile App Server doesn't return DBGeography on GET 【发布时间】:2021-03-05 00:23:12 【问题描述】:

我的 Microsoft Azure 移动应用服务器实例很乐意将 DBGeography POINT() 存储为表列,该列包含在确认已进行 POST 的 JSON 数据中。

我的“位置”数据对象:

public DbGeography Location  get; set; 

    [NotMapped]
    public double Longitude  get; set; 
    [NotMapped]
    public double Latitude  get; set; 

我的控制器:

public async Task<IHttpActionResult> PostI4Item([FromBody] IslandFourEntity item)
    
        var coordinates = DbGeography.FromText($"POINT(item.Longitude item.Latitude)");
        item.Location = coordinates;
        
        IslandFourEntity current = await InsertAsync(item);
        return CreatedAtRoute("Tables", new  id = current.Id , current);
    

“POST”请求后的邮递员响应:


"body": "Test body value",
"subject": "Test subject value",
"type": "type",
"location": 
    "geography": 
        "coordinateSystemId": 4326,
        "wellKnownText": "POINT (172.590401 -43.539994)"
    
,
"longitude": 172.590401,
"latitude": -43.539994,
"id": "58542f5ee84d4867ae1f3d2c3b098b1b",
"version": "AAAAAAAAD6I=",
"createdAt": "2021-03-05T00:16:12.292Z",
"updatedAt": "2021-03-05T00:16:12.731Z",
"deleted": false

但是,如果您获取所有表值或仅一个单独的项目,则包含 DBGeography 项目的列不包含在其中(尽管肯定保存在数据库中。)

该记录的默认 GET 响应:


"deleted": false,
"updatedAt": "2021-03-05T00:16:12.731Z",
"createdAt": "2021-03-05T00:16:12.292Z",
"version": "AAAAAAAAD6I=",
"id": "58542f5ee84d4867ae1f3d2c3b098b1b",
"type": "type",
"subject": "Test subject value",
"body": "Test body value"

如您所见,除“位置”外,所有其他列均已返回。

所以这个问题可能更适合那些有过 Microsoft Azure 移动应用服务经验的人,但是如何修改默认的 Query() 方法以将 DBGeography 序列化为字符串?

【问题讨论】:

【参考方案1】:

最终,你得到一个IQueryable&lt;T&gt;,然后它被 ASP.NET OData (v3) 系统或 Node.js 系统序列化(你没有说你使用的是哪个)。这里有两个问题 - IQueryable 返回什么,以及 oData 用它做什么。

由于它是 OData v3 端点,请尝试添加 ?$expand=location 以查看是否会扩展输出。阅读the docs 中的 $expand 选项 - 第 5.1.3 节涵盖了 $expand。

【讨论】:

我很高兴尝试您的建议,但是当我添加 $expand=location 时,它只返回 '"location": ' 我猜这表明存在一组数据,但是它返回的是空的。仍在寻找解决办法。 您可能需要使用自定义 Newtonsoft.JSON 转换器来确保 Location 没有嵌套两层深。即"location": "POINT(x,y)" 而不是你在做什么。这样你也不需要做 $expand。

以上是关于Azure 移动应用服务器在 GET 上不返回 DBGeography的主要内容,如果未能解决你的问题,请参考以下文章

Azure 移动服务推送不起作用

DLLImport 在 Azure 应用服务网络上不起作用。 3.1

如何从 Azure 移动应用服务调用 HTTP(Azure Functions)?

启用Azure移动服务身份验证会导致POST请求中的“资源不支持GET”

启用 Azure Active Directory 身份验证时,Azure 移动应用将 Http POST 调用重定向到 GET

.NET Core Web Api 错误 -4090 EADDRNOTAVAIL 地址在 Azure 上不可用