Web API DbGeography永远挂起

时间:2017-05-28 01:34:30

标签: c# asp.net-web-api spatial

我有一个实体 - 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不会?

1 个答案:

答案 0 :(得分:0)

Serializer trouble

根据您的问题,Breakpoint A首先应该永远不会受到影响,因为您明确告诉序列化程序忽略它,显然不会这样做。

  

很可能是您的序列化程序尝试序列化Location类型的属性DbGeography

简单地说,您的序列化程序不是忽略并尝试检索值来序列化它。根据您提供的装饰器,这不是您的意图。

注意:
根据您的序列化程序,您需要使用以下属性/装饰器之一

 // using System.Web.Extensions;
 // using System.Web.Script.Serialization;

 [IgnoreDataMember]                  
 [ScriptIgnore]                      
 [JsonIgnore]
 public DbGeography Location { ... }

替代方法是使用DataContractDataMember

[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;。