我可以执行以下操作吗?
[OperationContract]
[WebGet(UriTemplate = "/foo/{id}")]
string GetFoo(int id);
我希望我的服务兼具RESTful服务和RPC风格的SOAP服务。 如果可能的话,我想把int保留为int,而不是手工解析。
答案 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
。