2017-01-11 19 views
4

Я создаю новый веб-API C# OData4 с классом с именем Call, который имеет динамические свойства, которые OData 4 разрешает через «Открытые типы». Я считаю, что я все настроил и правильно настроил, но сериализованный ответ не включает динамические свойства.C# WebAPI неправильно упорядочивает динамические свойства

Я настроил что-то неправильно?

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(); 
    } 
} 

ответ

0

Если значение в паре ключей равно null, свойство просто не сериализуется. Я ожидал, что это будет сериализовать в

"ключ"

: нулевой

Вот некоторые дополнительные примеры

DynamicProperties.Add("somekey", 1); 

"somekey": 1


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

"somekey": "1"


DynamicProperties.Add("somekey", null); 

+0

Я должен противоречить этому в новом ответе –

0

Вы можете проверить в метаданных, по типу Call У Вас есть OpenType="true"? Если нет, попробуйте что делает его EntitySet изменить эту строку:

builder.ComplexType<Call>(); 

этой

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

Если у вас есть OpenType="true" в метаданных, убедитесь, что вы, безусловно, есть некоторые записи в DynamicProperties коллекции

+0

Я отлаживаю через может подтвердить, что это свойства в словаре. Я попробовал оба варианта в построителе, но не работает. Класс - это просто класс, он не выложен в XML, поэтому я не уверен, где я могу установить OpenType = true. У тебя есть идеи? – JacobVoller

+0

Он должен появиться в метаданных, которые были бы на URL-адресе, например http: // localhost/$ metadata – TomDoesCode

+0

Я получаю страницу с ошибкой, когда я пытаюсь это сделать, независимо от того, где бы я установил метаданные? Я не понимаю, откуда взялись эти данные. – JacobVoller

0

Вы можете включить сериализации нулевой оцененный динамические свойства в OData открытого типа путем добавления следующая строка (в моем коде в WebApiConfig.cs в методе Register (HttpC onfiguration config))

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

Затем мои динамические свойства с нулями начинают сериализоваться.

 Смежные вопросы

  • Нет связанных вопросов^_^