Могу ли я передать нестроку в службу WCF RESTful с помощью UriTemplate?

Могу ли я сделать следующее?

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

Я хочу, чтобы моя служба функционировала как служба RESTful, так и SOAP-сервис RPC. Если возможно, я хотел бы сохранить int как int, и не проводить парсинг вручную.

Ответ 1

Если я правильно помню, переменные UriTemplate в пути всегда разрешают строки при использовании WebGet или WebInvoke. Вы можете привязывать переменные UriTemplate только к int, long и т.д., Когда они находятся в части запроса UriTemplate.

Ответ 2

Как упоминалось выше, переместите id в часть запроса URI. Это сработало для меня:

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

См. "Схема URI" в wikipedia для получения дополнительной информации о различных частях URI: http://en.wikipedia.org/wiki/URI_scheme

Ответ 3

Как уже упоминалось, вы должны использовать строки запроса, чтобы передавать нестрочные параметры. В следующей статье описывается, как выполняется синтаксический анализ.

Расширяемость WCF - QueryStringConverter

Возвращаясь к "правильному" Расширение WCF, это сообщение недели о QueryStringConverter. Это на самом деле простая тема, которую нужно охватить, поскольку ее цель вполне (в отличие от других точек растяжимости, которые видели ранее, что могло бы используется для самых разных случаев) - внутри WCF QueryStringConverter используется только для конечных точек, которые имеют WebHttpBehavior применил к ним. И даже в тех, только на операциях которые имеют параметры, переданные по строкам запроса (либо операции с параметрами, отмеченными с помощью [WebGet] или [WebInvoke] с UriTemplate, который явно связывает некоторые параметры с запросом строка). QueryStringConverter - это часть, которая может конвертировать между параметры работы и их представление в строке запроса.

...

По умолчанию QueryStringConverter, используемый WebHttpBehavior, поддерживает изначально несколько типов, включая все простые числовые типы (Byte, SByte, Int16, Int32, Int64, UInt16, UInt32, UInt64, Single, Double, Decimal), Boolean, Char, Object, String, DateTime, DateTimeOffset, TimeSpan, Guid, Uri и массивы Byte (по сути, все типы которые DataContractSerializer считает "примитивами", с исключение XmlQualifiedName). Типы перечислений также поддерживается по умолчанию (строковое представление значений перечисления используемый). Наконец, существует еще один набор поддерживаемых типов по умолчанию QueryStringConverter - любой, который объявляет [TypeConverter] с преобразователем типа, который может преобразовывать type to и from string (подробнее об этом ниже).

Ответ 4

К сожалению, вы должны сделать синтаксический анализ самостоятельно, если хотите использовать UriTemplate.