我有一个实体 - GeoEntity - 具有DbGeography
属性。在我的Web Api中,我有一个POST端点,允许您添加新的 GeoEntities 。
实体 -
public class GeoEntity {
[JsonProperty("point")]
[NotMapped]
public GeoPoint Point { get; set; }
[JsonIgnore]
public DbGeography Location {
get
{
// Breakpoint A
return DbGeography.FromText($"POINT({Point.Longitude} {Point.Latitude})", 4326);
}
set
{
Point.Latitutde = value.Latitide;
Point.Longitude = value.Longitude;
}
}
}
public class GeoPoint {
public double Latitude { get; set; }
public double Longitude { get; set; }
}
API -
[HttpPost]
[Route("")]
public async Task<IHttpActionResult> Add(GeoEntity entity)
{
// Breakpoint B
var newGeo = _geoService.Add(entity);
return Ok(newGeo);
}
当我发送以下帖子时 -
{
"point": {
"latitude": 10,
"longitude": 10
}
}
我被卡在断点A 上。当我从该端点继续时,我从未到达断点B 并且http请求永远停留等待。
如果我试着踩过来,没有任何反应。
我已将FromText
结果捕获到临时var x
,以确保它不会因为尝试解析而陷入困境 - 并且确定不够 - 它不会被卡住试图解析。 DbGeography对象创建得很好。
如果我在get:get { return null; }
中返回null,我确实到达断点B 。但显然我的数据丢失了。
为什么返回实际DbGeography
对象的任何想法会导致请求永远挂起而返回null
不会?
答案 0 :(得分:0)
根据您的问题,Breakpoint A
首先应该永远不会受到影响,因为您明确告诉序列化程序忽略它,显然不会这样做。
很可能是您的序列化程序尝试序列化
Location
类型的属性DbGeography
。
简单地说,您的序列化程序不是忽略它并尝试检索值来序列化它。根据您提供的装饰器,这不是您的意图。
注意:
根据您的序列化程序,您需要使用以下属性/装饰器之一
// using System.Web.Extensions;
// using System.Web.Script.Serialization;
[IgnoreDataMember]
[ScriptIgnore]
[JsonIgnore]
public DbGeography Location { ... }
替代方法是使用DataContract
和DataMember
[DataContract]
public class Computer
{
// included in JSON
[DataMember]
public GeoPoint Point { get; set; }
// ignored
public DbGeography Location { get; set; }
}
如果由于某种原因你 尝试序列化它...那么你需要验证DbGeography.FromText()
的实现及其返回类型({{1对象实际上是#34; serialize-able&#34;。