2012-02-21 5 views
6

Ho migrato un metodo API da un'azione MVC standard alla nuova beta API Web asp.net e improvvisamente una proprietà di sola lettura non è più serializzata (entrambi restituiscono JSON). È questo comportamento previsto?ASP.NET Web-API che non serializza la proprietà readonly

Edit: Aggiunto esempio di codice

Ho sia Newtonsoft.Json 4.0.8 e 4.0 System.Json riferimento attraverso pacchetti Nuget

 public IQueryable<Car> Gets() 
     { 
      return _carRepository.GetCars(); 
     } 

     public class Car 
     { 
      public IEnumerable<Photo> Photos 
      { 
       get { return _photos; } 
      } 

      public string PreviewImageUrl // No longer serialized 
      { 
       get 
       { 
        var mainImage = Photos.FirstOrDefault(o => o.IsMainPreview) Photos.FirstOrDefault(); 
         return mainImage != null ? mainImage.Url : (string.Empty); 
        } 
       } 
      } 
     } 
+0

non previsto. potresti pubblicare un codice che riproponga il problema. – marcind

+0

Quale serializzatore JSON stai usando? –

risposta

10

Il JsonMediaTypeFormatter fornito con il Beta utilizza un serializzatore che non supporta proprietà di sola lettura (dal momento che non sarebbe andata e ritorno in modo corretto). Stiamo progettando di affrontare questo per le prossime realese.

Nel frattempo è possibile utilizzare un'implementazione personalizzata JSON MediaTypeFormatter che utilizza Json.NET (ce n'è uno disponibile here) anziché il formattatore incorporato.

Aggiornamento: controllare anche il blog di Henrik su collegare un formattatore JSON.NET: http://blogs.msdn.com/b/henrikn/archive/2012/02/18/using-json-net-with-asp-net-web-api.aspx

+1

appena aggiornato a rilascio RC e questo sembra ancora essere un problema. Sei curioso di sapere se le cose cambieranno prima della versione finale o non dovremmo aspettarci che le proprietà di sola lettura siano serializzate? Grazie! –

+0

Si può provare l'ultima nightly build (istruzioni: http://aspnetwebstack.codeplex.com/discussions/353867). Inoltre, assicurati di aver effettivamente disinstallato i bit Beta dal tuo sistema. Se è ancora un problema potresti pubblicare una recensione qui: http://aspnetwebstack.codeplex.com/. Grazie. – marcind

+0

avevo disinstallato la versione beta e installato il RC, ma trascurato di aggiornare i pacchetti del mio progetto con NuGet, così mi è stato ancora utilizzando bit beta. Dopo l'aggiornamento, la proprietà di sola lettura viene serializzata utilizzando JSON, ma non come XML. Per i miei scopi, JSON è tutto quello che ho bisogno, quindi sono bene, ma sembra come dovrebbe comportarsi allo stesso con serializzazione XML? –

4

Non so se questo è un comportamento previsto o non. Direi che questo è previsto per i parametri di input (perché non puoi impostare i loro valori) ma non per i parametri di output. Quindi direi che questo è un bug per un parametro di output. Ed ecco un esempio che illustra il problema:

Modello:

public class Product 
{ 
    public Product() 
    { 
     Prop1 = "prop1 value"; 
     Prop2 = "prop2 value"; 
     Prop3 = "prop3 value"; 
    } 

    public string Prop1 { get; set; } 

    [ReadOnly(true)] 
    public string Prop2 { get; set; } 

    public string Prop3 { get; protected set; } 
} 

Controller:

public class ProductsController : ApiController 
{ 
    public Product Get(int id) 
    { 
     return new Product(); 
    } 
} 

Richiesta:

api/products/5 

Risultato:

{"Prop1":"prop1 value","Prop2":"prop2 value"} 

Quindi, se la struttura non dispone di un setter pubblico non è serializzato che non sembra normale, come la classe Product viene utilizzata come uscita in questo caso.

Vorrei suggerire l'apertura di un ticket di connessione in modo che Microsoft possa risolvere questo problema prima del rilascio, o almeno dire che questo è di progettazione.