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

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

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

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

4 ответов


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


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

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

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


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

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

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

...

QueryStringConverter по умолчанию, используемый webhttpbehavior поддерживает изначально несколько типов, включая все простые числовые типы


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