我可以使用UriTemplate将非string传递给WCF RESTful服务吗?

我可以做以下吗?

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

我希望我的服务既可以作为REST风格的服务,也可以作为RPC风格的SOAP服务。 如果可能的话,我想保留int作为整数,而不是手工parsing。

如果我没有记错,path中的UriTemplatevariables在使用WebGet或WebInvoke时总是parsing为string。 当UriTemplatevariables位于UriTemplate的查询部分时,您只能将UriTemplatevariables绑定到int,long等。

正如dthrasher提到的,将id移动到URI的查询部分。 这对我工作:

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

有关URI的不同部分的更多信息,请参阅wikipedia上的“URIscheme”: http : //en.wikipedia.org/wiki/URI_scheme

正如其他人提到的,你必须使用查询string来传递非string参数。 以下文章详细介绍了parsing是如何完成的。

WCF可扩展性 – QueryStringConverter

回到“适当的”WCF可扩展性,本周的post是关于QueryStringConverter。 这实际上是一个简单的话题,因为它的目的是非常明确的(不像其他的扩展点,可以用于各种各样的情况) – 在WCF中,QueryStringConverter只用于WebHttpBehavior被应用的端点给他们。 甚至在那些只有通过查询string传递参数的操作上(使用带有[WebGet]标记的参数的操作或使用显式地将某些参数绑定到查询string的UriTemplate的[WebInvoke]操作)。 QueryStringConverter是可以在查询string中的操作参数及其表示之间进行转换的一部分。

WebHttpBehavior使用的默认QueryStringConverter本地支持几种types,包括所有简单的数字types(Byte,SByte,Int16,Int32,Int64,UInt16,UInt32,UInt64,Single,Double,Decimal),Boolean,Char,Object,String,DateTime ,DateTimeOffset,TimeSpan,Guid,Uri和Byte数组 (本质上,DataContractSerializer认为是“primitives”的所有types,但XmlQualifiedName除外)。 枚举types也被默认支持 (使用枚举值的string表示)。 最后,还有一组默认的QueryStringConverter支持的types – 任何一个声明一个[TypeConverter]属性的types转换器,可以将stringtypes转换为string(下面会详细介绍)。

不幸的是,如果你想使用UriTemplate你必须自己parsing。