Posso passare non stringa al servizio RESTful WCF usando UriTemplate?

Posso fare quanto segue?

[OperationContract] [WebGet(UriTemplate = "/foo/{id}")] string GetFoo(int id); 

Mi piacerebbe che il mio servizio funzionasse sia come servizio RESTful sia come servizio SOAP in stile RPC. Se ansible mi piacerebbe mantenere int come int, e non fare l’analisi a mano.

Se ricordo correttamente, le variabili UriTemplate nel percorso si risolvono sempre in stringhe quando si utilizza WebGet o WebInvoke. È ansible associare solo le variabili UriTemplate a int, long e così via quando si trovano nella porzione di query di UriTemplate.

Come menzionato dthrasher, sposta id alla parte di query dell’URI. Questo ha funzionato per me:

 [OperationContract] [WebGet(UriTemplate = "/foo?id={id}")] string GetFoo(int id); 

Vedi “Schema URI” su wikipedia per maggiori informazioni sulle diverse parti di un URI: http://en.wikipedia.org/wiki/URI_scheme

Come già menzionato, è necessario utilizzare stringhe di query per passare parametri non stringa. Il seguente articolo spiega come è fatto l’analisi.

Estensibilità WCF – QueryStringConverter

Tornando all’estensione della “WCF” corretta, il post di questa settimana riguarda QueryStringConverter. Questo è in realtà un argomento semplice da trattare, poiché il suo scopo è piuttosto specifico (a differenza di altri punti di estensibilità visti prima, che potrebbero essere utilizzati per un’ampia varietà di casi) – all’interno di WCF il QueryStringConverter viene utilizzato solo sugli endpoint che hanno applicato WebHttpBehavior a loro. E anche in quelli, solo su operazioni che hanno parametri passati tramite le stringhe di query (operazioni con parametri contrassegnati con [WebGet] o un’operazione [WebInvoke] con un UriTemplate che associa esplicitamente alcuni parametri alla stringa di query). Un QueryStringConverter è il pezzo che può convertire tra i parametri operativi e la loro rappresentazione in una stringa di query.

QueryStringConverter predefinito utilizzato da WebHttpBehavior supporta nativamente diversi tipi, inclusi tutti i tipi numerici semplici (Byte, SByte, Int16, Int32, Int64, UInt16, UInt32, UInt64, Single, Double, Decimal), Boolean, Char, Object, String, DateTime , DateTimeOffset, TimeSpan, Guid, Uri e array di Byte (in sostanza, tutti i tipi che DataContractSerializer considerano “primitivi”, con l’eccezione di XmlQualifiedName). I tipi di enumerazione sono anche supportati di default (viene utilizzata la rappresentazione della stringa dei valori enum). Infine, esiste anche un altro insieme di tipi supportati dal QueryStringConverter predefinito, ovvero uno che dichiara un attributo [TypeConverter] con un convertitore di tipi che può convertire il tipo in stringhe e da stringhe (maggiori informazioni in seguito).

Sfortunatamente è necessario eseguire l’analisi autonomamente se si desidera utilizzare UriTemplate .