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<T>
,然后它被 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的主要内容,如果未能解决你的问题,请参考以下文章
DLLImport 在 Azure 应用服务网络上不起作用。 3.1
如何从 Azure 移动应用服务调用 HTTP(Azure Functions)?
启用Azure移动服务身份验证会导致POST请求中的“资源不支持GET”
启用 Azure Active Directory 身份验证时,Azure 移动应用将 Http POST 调用重定向到 GET