我可以这样做吗?
[OperationContract] [WebGet(UriTemplate = "/foo/{id}")] string GetFoo(int id);
我希望我的服务兼具RESTful服务和RPC风格的SOAP服务.如果可能的话,我想将int保留为int,而不是手工解析.
正如dthrasher所提到的,将id移动到URI的查询部分.这对我有用:
[OperationContract] [WebGet(UriTemplate = "/foo?id={id}")] string GetFoo(int id);
有关URI的不同部分的更多信息,请参阅维基百科上的"URI方案":http: //en.wikipedia.org/wiki/URI_scheme
如果我没记错的话,在使用WebGet或WebInvoke时,路径中的UriTemplate变量总是解析为字符串.当UriTemplate变量位于UriTemplate的查询部分时,您只能将它们绑定到int,long等.
就像其他人提到的那样,您必须使用查询字符串才能传递非字符串参数。下面的文章详细介绍了如何完成解析。
WCF可扩展性– QueryStringConverter
回到“适当的” WCF可扩展性,本周的帖子是关于QueryStringConverter的。这实际上是一个简单的主题,因为它的目的是非常特定的(与之前看到的其他可扩展性点不同,它可以用于多种情况)–在WCF中,QueryStringConverter仅用于应用了WebHttpBehavior的端点给他们。即使在那些操作中,也仅在具有通过查询字符串传递参数的操作上(带有参数标记为[WebGet]的操作或带有显式绑定一些参数到查询字符串的UriTemplate的[WebInvoke]操作)。QueryStringConverter是可以在操作参数及其在查询字符串中的表示形式之间进行转换的部分。
...
WebHttpBehavior使用的默认QueryStringConverter本机支持几种类型,包括所有简单的数字类型(Byte,SByte,Int16,Int32,Int64,UInt16,UInt32,UInt64,Single,Double,Decimal),布尔值,Char,Object,String,DateTime ,DateTimeOffset,TimeSpan,Guid,Uri和Byte数组(实际上,DataContractSerializer认为所有类型都是“原语”,XmlQualifiedName除外)。默认情况下也支持枚举类型(使用枚举值的字符串表示形式)。最后,默认的QueryStringConverter还支持另一组类型-任何使用类型转换器声明[TypeConverter]属性的类型转换器都可以在字符串之间来回转换类型(在下文中有更多介绍)。