属性名称“ @ iot.id”无效;属性名称不得包含任何保留字符':','。','@'

时间:2018-12-25 06:01:54

标签: asp.net rest asp.net-web-api odata

我有一个引用Microsoft.AspNet.Odata的Asp.net Web Api项目。我想返回属性具有用于序列化的DataMember属性的数据模型。一切正常,但是当我调用method时,引发异常,例如“属性名称'@ iot.id'无效;属性名称不得包含任何保留字符':','。','@'。”

返回如下所示的模型

[DataContract]
public class Sensor:AbstractEntity
{
    private string _name;
    private string _description;
    //private object _metadata;
    private string _metadata;
    private string _encodingType;
    private string _datastreamsNavigationLink;
    private List<Datastream> _datastreams;

    public Sensor()
    {
        _datastreams = new List<Datastream>();
        Datastreams = new List<Datastream>();
    }

    [JsonProperty("name")]
    [DataMember(Name ="name")]
    public string Name
    {
        get {return _name; }
        set { SetProperty(ref _name, value); }
    }

    [JsonProperty("description")]
    public string Description
    {
        get { return _description; }
        set { SetProperty(ref _description, value); }
    }

    [JsonProperty("metadata")]
    public string Metadata
    {
        get { return _metadata; }
        set { SetProperty(ref _metadata, value); }
    }

    [JsonProperty("encodingType")]
    public string EncodingType
    {
        get { return _encodingType; }
        set { SetProperty(ref _encodingType, value);
        }
    }

    [JsonProperty("Datastreams@iot.navigationLink")]
    public  string DatastreamsNavigationLink
    {
        get { return _datastreamsNavigationLink; }
        set { SetProperty(ref _datastreamsNavigationLink, value);
        }
    }

    [JsonProperty("Datastreams")]
    [Expand(ExpandType =SelectExpandType.Allowed,MaxDepth =1)]
    public  List<Datastream> Datastreams { get; set; }

}

}

[DataContract]
public class AbstractEntity : INotifyPropertyChanged
{
    private decimal _id;
    private string _selfLink;

    public event PropertyChangedEventHandler PropertyChanged;

    [JsonProperty("@iot.id")]
    [DataMember(Name = "@iot.id")]
    [Key]
    public decimal Id
    {
        get { return _id; }
        set { SetProperty(ref _id, value); }
    }

    [JsonProperty("@iot.selfLink")]
    [DataMember(Name = "@iot.selfLink")]
    public string SelfLink
    {
        get { return _selfLink; }
        set { SetProperty(ref _selfLink, value); }
    }

    protected bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = null)
    {
        if (Equals(storage, value))
        {
            return false;
        }

        storage = value;
        OnPropertyChanged(propertyName);
        return true;
    }

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }


    public void CreateSelfLink(string apiUrl,string entityLink,decimal? id)
    {
        if (id != null && id > 0)
            entityLink = string.Format("{0}({1})", entityLink, id);
        _selfLink = string.Format("{0}/api/{1}", apiUrl, entityLink);
    }


    public string CreateEntityLink(string apiUrl, string entityType1,string entitType2, decimal? id)
    {
        if (id != null && id > 0)
            entityType1 = string.Format("{0}({1})", entityType1, id);
        return string.Format("{0}/api/{1}/{2}", apiUrl, entityType1,entitType2);
    }

}

}

我调用的方法

    [EnableQuery]
    public async Task<IHttpActionResult> GetSensors(ODataQueryOptions<Sensor> queryOptions)
    {

        // validate the query.
        try
        {
            queryOptions.Validate(_validationSettings);
        }
        catch (ODataException ex)
        {

            return BadRequest(ex.Message);
        }

        return Ok(_sensorService.Get(queryOptions));
    }

这是global.asax配置

   config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
        config.Formatters.Clear();
        var formater = new JsonMediaTypeFormatter()
        {
            SerializerSettings = new JsonSerializerSettings()
            {
                ContractResolver = new DefaultContractResolver()

            },
            UseDataContractJsonSerializer = true,

        };
        //Microsoft.AspNet.OData.Formatter.Serialization.ODataResourceSetSerializer.
        //formater.SerializerSettings.
        config.Formatters.Add(formater);

这是我要退回的内容

  {
"@odata.context": "http://localhost:16862/api/$metadata#Sensors",
"value": [{
    "@iot.id": 4,
    "@iot.selfLink": "https://toronto-bike-snapshot.sensorup.com/v1.0/Sensors(4)",
    "description": "A sensor for tracking how many docks are available in a bike station",
    "name": "available_docks",
    "encodingType": "text/plan",
    "metadata": "https://member.bikesharetoronto.com/stations",
    "Datastreams@iot.navigationLink": "https://toronto-bike-snapshot.sensorup.com/v1.0/Sensors(4)/Datastreams"
}]
}

0 个答案:

没有答案