2016-12-02 7 views
1

Ich habe einen Web-API OData v4-Dienst, den ich erstellt habe. Ich versuche, eine gebundene-Funktion zu erzeugen, die einen Zeitspanne Parameter hat eine Signatur in dem Controller OData definiert ist ähnlich die unten:Web-API-OData-Funktion mit TimeSpan

public IQueryable<ProductionRecordDTO> GetProduction(
     [FromODataUri]DateTimeOffset startDate, 
     [FromODataUri]DateTimeOffset endDate, 
     [FromODataUri]TimeSpan sampleInterval) 

es im OData Modellbildner konfiguriert ist wie folgt:

var getProduction = builder.EntitySet<ProductDTO>("Products").EntityType.Collection.Function("GetProduction"); 
     getProduction.Namespace = "ProductsService"; 
     getProduction.ReturnsCollection<ProductionRecordDTO>(); 
     getProduction.Parameter<DateTimeOffset>("StartDate"); 
     getProduction.Parameter<DateTimeOffset>("EndDate"); 
     getProduction.Parameter<TimeSpan>("SampleInterval"); 

Bei der Ausführung wird das Modell scheinbar ordnungsgemäß erstellt. Die Metadatenbeschreibung zeigt, dass "SampleInterval" ordnungsgemäß als Edm.Durationstyp definiert ist.

Wenn ich versuche jedoch, diese Methode zu nennen mit einer URL wie:

http://dev-pc/odata/Products/ProductsService.GetProduction(StartDate=2014-01-01T00:00:00Z, EndDate=2017-01-01T00:00:00Z, SampleInterval=P1Y) 

Ein ODataException mit der Meldung ‚SampleInterval = P1Y‘ ausgelöst wird, ist in ihrem Umfang nicht. Das Gleiche gilt für jede ISO 8601-Dauerformatvariation, die ich gebe.

Verwendung:

  • Microsoft.OData.Core - v6.15.0
  • Microsoft.AspNet.OData - v5.9.1

Jede mögliche Unterstützung angeboten würde sehr geschätzt.

Antwort

1

Ich fand die Ursache. Die Parameter der Edm.Duration können offensichtlich nicht buchstäblich interpretiert werden und müssen um einen Typ gewickelt sein, z. duration'P1D' In diesem Fall ist ein korrekter Aufruf gewesen wäre:

http://dev-pc/odata/Products/ProductsService.GetProduction(StartDate=2014-01-01T00:00:00Z, EndDate=2017-01-01T00:00:00Z, SampleInterval=duration'P1D') 

Das hieß, Microsofts Implementierung scheint nicht periodische Arten größer als Tage zu akzeptieren. P1W, P1M und P1Y werden alle abgelehnt.