我可以做以下事情吗?
[OperationContract] [WebGet(UriTemplate = "/foo/{id}")] string GetFoo(int id);
我希望我的服务同时作为 RESTful 服务和 RPC 风格的 SOAP 服务。 如果可能的话,我希望将 int 保留为 int,而不是手动解析。
不幸的是,如果要使用 UriTemplate,必须自己解析。
UriTemplate
如果我没记错的话,在使用 WebGet 或 WebInvoke 时,路径中的 UriTemplate 变量总是解析为字符串。当 UriTemplate 变量位于 UriTemplate 的查询部分时,只能将它们绑定到 int、 long 等。
正如 dthrasher 提到的,将 id 移动到 URI 的查询部分:
[OperationContract] [WebGet(UriTemplate = "/foo?id={id}")] string GetFoo(int id);
有关 URI 不同部分的更多信息,请参见 Wikipedia 上的“ URI scheme”: Http://en.wikipedia.org/wiki/uri_scheme
正如其他人提到的,必须使用查询字符串才能传递非字符串参数。下面的文章详细介绍了解析是如何完成的。
WCF 扩展性-QueryStringConverter
回到“适当” WCF 的可扩展性,本周的文章是关于 QueryStringConverter 的。 这实际上是一个要涉及的简单主题,因为它的目的非常明确 特定的(不像以前看到的其他扩展点,它可以 - 在周转基金内 QueryStringConverter 仅用于具有 WebHttpBehavior 适用于它们,即使在那些情况下,也只适用于操作 它们具有通过查询字符串 传递的参数(任一操作 使用标记为[ WebGet ]的参数或使用带有 显式地将一些参数绑定到查询的 UriTemplate QueryStringConverter 是可以在 操作参数及其在查询字符串中的表示。 ... WebHttpBehavior 支持的默认 QueryStringConverter 原生的几种类型,包括所有简单的数值类型 < strong > (Byte, SByte,Int16,Int32,Int64,UInt16,UInt32,UInt64,单,双, 十进制) ,布尔值,字符,对象,字符串,日期时间,日期时间偏移量, TimeSpan、 Guid、 Uri 和 Byte 的数组(基本上是所有类型 DataContractSerializer 认为是“原语”的 XmlQualifiedName 例外)。 < strong > 枚举类型也是 由 default 支持(枚举值的字符串表示形式为 最后,还支持另一组类型 默认的 QueryStringConverter-任何声明 [ TypeConverter ]属性的类型转换器,该类型转换器可以将 在字符串之间键入或从字符串键入(下面将详细介绍)。
回到“适当” WCF 的可扩展性,本周的文章是关于 QueryStringConverter 的。 这实际上是一个要涉及的简单主题,因为它的目的非常明确 特定的(不像以前看到的其他扩展点,它可以 - 在周转基金内 QueryStringConverter 仅用于具有 WebHttpBehavior 适用于它们,即使在那些情况下,也只适用于操作 它们具有通过查询字符串 传递的参数(任一操作 使用标记为[ WebGet ]的参数或使用带有 显式地将一些参数绑定到查询的 UriTemplate QueryStringConverter 是可以在 操作参数及其在查询字符串中的表示。
...
WebHttpBehavior 支持的默认 QueryStringConverter 原生的几种类型,包括所有简单的数值类型 < strong > (Byte, SByte,Int16,Int32,Int64,UInt16,UInt32,UInt64,单,双, 十进制) ,布尔值,字符,对象,字符串,日期时间,日期时间偏移量, TimeSpan、 Guid、 Uri 和 Byte 的数组(基本上是所有类型 DataContractSerializer 认为是“原语”的 XmlQualifiedName 例外)。 < strong > 枚举类型也是 由 default 支持(枚举值的字符串表示形式为 最后,还支持另一组类型 默认的 QueryStringConverter-任何声明 [ TypeConverter ]属性的类型转换器,该类型转换器可以将 在字符串之间键入或从字符串键入(下面将详细介绍)。