Почему стартовый комплект WCF 3.5 REST делает это? - PullRequest
1 голос
/ 20 апреля 2010

Я устанавливаю конечную точку REST, которая выглядит следующим образом:

[WebInvoke(Method = "POST", UriTemplate = "?format=json", BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json)]

и

[WebInvoke(Method = "DELETE", UriTemplate = "?token={token}&format=json", ResponseFormat = WebMessageFormat.Json)]

Выше выдается следующая ошибка:

UriTemplateTable does not support '?format=json' and '?token={token}&format=json' since they are not equivalent, but cannot be disambiguated because they have equivalent paths and the same common literal values for the query string. See the documentation for UriTemplateTable for more detail.

Я не эксперт в WCF, но я думаю, что он должен отображаться сначала с помощью метода HTTP, а затем с помощью шаблона URI.Кажется, это задом наперед.Если оба моих URI-шаблона имеют вид:

?token={token}&format=json

Это работает, потому что они эквивалентны, и затем кажется, что он смотрит на метод HTTP, где один - POST, а другой - DELETE.

IsREST должен работать таким образом?Почему таблицы шаблонов URI не сортируются сначала по методу HTTP, а затем по шаблону URI?Это может вызвать некоторые серьезные расстройства, когда 1 метод HTTP требует параметр, а другой - нет, или если я хочу сделать необязательные параметры (например, если параметр 'format' не передан, по умолчанию используется XML).

Ответы [ 2 ]

1 голос
/ 21 апреля 2010

Чтобы исправить это, я должен был сделать следующее с моим методом POST:

[WebInvoke(Method = "POST", UriTemplate = "?token={token}&format=json", BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json)]

Затем объявление моего метода приняло дополнительный параметр, называемый «строковый токен». Затем я просто игнорирую значение «токен» в моем методе. Если клиент не передает значение для токена, WCF передает пустую строку, но, поскольку я не работаю с ним, это не имеет значения.

Это все еще неприятно с WCF 3.5, но это хороший обходной путь, если кто-то еще столкнется с этим.

1 голос
/ 21 апреля 2010

Я считаю, что это просто ограничение возможностей маршрутизации UriTemplateTable.Боюсь, это не проблема REST, а проблема WCF.

Вы пытались повторить ошибку в .Net 4.0?Похоже, они проделали довольно большую работу для дальнейшей поддержки сценариев REST в .Net 4.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...