API Web Asp.Net MVC4: restituisce Json formattato OData dalla query senza MediaTypeFormatter personalizzato
-
29-10-2019 - |
Domanda
Sto cercando di utilizzare la nuova WebAPI beta per creare un servizio web che posso interrogare utilizzando le convenzioni della stringa di query OData e fare in modo che restituisca OData formattato Json . Voglio anche usare OData 2.0 (invece di 1.0).
Anche se non sembra che abbia il supporto per $ select e le intestazioni sembrano essere in grado di sovrascrivere l'opzione $ format , la restituzione di un IQueryable
generico sembra fornire supporto per la maggior parte delle altre opzioni di query di cui ho bisogno.
Quello con cui sto veramente lottando è il modo migliore per fornire oggetti Json che soddisfano le specifiche OData 2.0. WebAPI restituisce solo i normali dati Json quando interrogati. Ad esempio, se eseguo una richiesta GET di qualcosa di simile ...
http://localhost:XXXXX/vendor/?$filter=RONUMBER eq '2597385'&$select=VENDORID,VENDORNAME&$top=1&$format=Json
..per ottenere il miglior hit corrispondente al numero RON specificato sulla mia macchina di sviluppo, ottengo una risposta contenente il seguente Json ...
[{"MEPartNumber":"11-2222-3-4444","MFGPartNumber":"123456-123","MFGSerialNumber":"ABC123","RONumber":"987654321","VendorId":"1234567","VendorName":"ACME SERVICE CENTER"}]
Ho bisogno di Json che soddisfi le specifiche OData 2.0. Qualcosa di più simile a questo ..
OData V2: {
"d" : {
"results": {
"__metadata": {
"uri": "http://someserver/foo/vendor(1)",
"type": "Vendor"
},
"MEPartNumber": "11-2222-3-4444",
"MFGPartNumber": "123456-123",
"MFGSerialNumber": "ABC123",
"RONumber":"987654321",
"VendorId":"1234567",
"VendorName": "ACME SERVICE CENTER"
}
}
}
Suppongo di poter scrivere un MediaTypeFormatter
personalizzato per ottenere la struttura che desidero. Potrei anche essere in grado di modificare i miei oggetti restituiti per imitare la struttura del Json desiderato. A parte queste due opzioni, qualcuno conosce un modo intelligente per fare in modo che WebAPI mi fornisca oggetti Json formattati OData 2.0?
Soluzione
Devi scrivere il tuo MediaTypeFormatter
per fornire la corretta serializzazione.Non abbiamo fornito un formattatore OData in MVC 4 Beta, ma la precedente incarnazione di WCF Web Api ha alcuni esempi di come scriverne uno. http://wcf.codeplex.com/SourceControl/list/changesets Cerca Microsoft.Net.Http.Formatting.OData (dovresti essere in grado di utilizzare la maggior parte dei sorgenti, anche se alcuni dettagli di implementazione potrebbero essere cambiati)
Un'alternativa potrebbe essere quella di provare a costruire un DTO che serializzi la forma prevista da OData v2.