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

时间:2009-02-13 13:49:53

标签: .net wcf web-services rest

我可以执行以下操作吗?

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

我希望我的服务兼具RESTful服务和RPC风格的SOAP服务。 如果可能的话,我想把int保留为int,而不是手工解析。

4 个答案:

答案 0 :(得分:75)

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

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

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

答案 1 :(得分:68)

如果我没记错的话,使用WebGet或WebInvoke时,路径中的UriTemplate变量始终会解析为字符串。当UriTemplate变量位于UriTemplate的查询部分时,您只能将它们绑定到int,long等。

答案 2 :(得分:4)

正如其他人所提到的,您必须使用查询字符串才能传递非字符串参数。以下文章详细介绍了解析的完成方式。

WCF Extensibility – QueryStringConverter

  

回归“正确”   WCF可扩展性,本周的帖子是关于QueryStringConverter的。   这实际上是一个简单的话题,因为其目的非常明确   特定的(不同于之前看到的其他可扩展性点,可能   用于各种各样的情况) - 在WCF内   QueryStringConverter仅用于具有。的端点   WebHttpBehavior应用于它们。甚至在那些,仅在操作上   其中包含通过查询字符串传递的参数(任一操作   参数标记为[WebGet]或[WebInvoke]操作带有   UriTemplate显式地将一些参数绑定到查询   串)。 QueryStringConverter是可以在它们之间进行转换的部分   操作参数及其在查询字符串中的表示。

     

...

     

WebHttpBehavior使用的默认QueryStringConverter支持   原生的几种类型,包括所有简单的数字类型(字节,   SByte,Int16,Int32,Int64,UInt16,UInt32,UInt64,Single,Double,   Decimal),Boolean,Char,Object,String,DateTime,DateTimeOffset,   TimeSpan,Guid,Uri和Byte数组(基本上是所有类型   DataContractSerializer认为是“原始”,用   XmlQualifiedName除外)。 枚举类型也是   默认支持(枚举值的字符串表示形式为   用过的)。最后,还有另一组支持的类型   默认的QueryStringConverter - 声明一个的任何一个   [TypeConverter]属性带有可以转换的类型转换器   输入和输入字符串(更多内容见下文)。

答案 3 :(得分:3)

不幸的是,如果您想使用UriTemplate

,您必须自己进行解析