У меня есть проект Asp.net Web Api, который ссылается на Microsoft.AspNet.Odata.Я хочу вернуть модель данных, чтобы свойства имели атрибут DataMember для сериализации.Все хорошо, но когда я вызываю метод, выдается исключение как «Имя свойства '@ 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"
}]
}