2017-01-11 6 views
4

Ich erstelle eine neue C# OData4 Web API mit einer Klasse namens Call, die dynamische Eigenschaften hat, die OData 4 über "Open Types" ermöglicht. Ich glaube, ich habe alles eingerichtet und richtig konfiguriert, aber die serialisierte Antwort enthält nicht die dynamischen Eigenschaften.C# WebAPI dynamische Eigenschaften nicht korrekt serialisieren

Habe ich etwas falsch konfiguriert?

public partial class Call 
{ 
    public int Id { get; set; } 
    public string Email { get; set; } 
    public IDictionary<string, object> DynamicProperties { get; } 
} 

public class CallController : ODataController 
{ 
    [EnableQuery] 
    public IQueryable<Call> GetCall([FromODataUri] int key) 
    { 
     return _context.Call.GetAll(); 
    } 
} 

public static partial class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     AllowUriOperations(config); 

     ODataModelBuilder builder = new ODataConventionModelBuilder(); 
     builder.ComplexType<Call>(); 
     var model = builder.GetEdmModel(); 

     config.MapODataServiceRoute(RoutePrefix.OData4, RoutePrefix.OData4, model);  
    } 

    private static void AllowUriOperations(HttpConfiguration config) 
    { 
     config.Count(); 
     config.Filter(); 
     config.OrderBy(); 
     config.Expand(); 
     config.Select(); 
    } 
} 

Antwort

0

Wenn der Wert in einem Schlüsselpaar null ist, wird die Eigenschaft einfach nicht serialisiert. Ich hatte erwartet, es zu

"Schlüssel" serialisiert werden: null

Hier

DynamicProperties.Add("somekey", 1); 

"somekey" einige weitere Beispiele sind: 1


DynamicProperties.Add("somekey", "1"); 

"somekey": "1"


DynamicProperties.Add("somekey", null); 

+0

Dem muss ich in einer neuen Antwort widersprechen –

0

Können Sie in Ihren Metadaten überprüfen, auf dem Typ Call Sie OpenType="true" tun haben? Wenn nicht, versuchen Sie es ein EntitySet Änderung dieser Linie machen:

builder.ComplexType<Call>(); 

dieser

builder.EntitySet<Call>("Calls"); 

Wenn Sie OpenType="true" in Metadaten verfügen, überprüfen Sie, dass Sie auf jeden Fall einige Einträge haben in Ihrer DynamicProperties Sammlung

+0

Ich Debugging kann bestätigen, dass Eigenschaften im Wörterbuch sind. Ich habe beide Optionen auf dem Builder versucht, aber keiner funktioniert. Die Klasse ist einfach eine Klasse, sie ist nicht in XML angeordnet, daher bin ich mir nicht sicher, wo ich den OpenType = true setzen könnte. Hast du eine Idee? – JacobVoller

+0

Es sollte in den Metadaten erscheinen, die in einer URL wie http: // localhost/$ metadata sein würden – TomDoesCode

+0

Ich erhalte eine Fehlerseite, wenn ich das versuche, unabhängig, wo würde ich die Metadaten einstellen? Ich verstehe nicht, woher diese Daten stammen. – JacobVoller

0

Sie Serialisierung von null ermöglichen kann durch dynamische Eigenschaften in OData offenen Arten bewertet Hinzufügen die folgende Zeile (in meinem Code in WebApiConfig.cs im Methodenregister (HttpC Konfigurationskonfiguration))

config.Properties.AddOrUpdate("System.Web.OData.NullDynamicPropertyKey", val=>true, (oldVal,newVal)=>true); 

Dann beginnen meine dynamischen Eigenschaften mit Nullen zu serialisieren.

Verwandte Themen