Почему эта служба WCF не распознает параметр UriTemplate? - PullRequest
7 голосов
/ 13 февраля 2009

Я создал следующую службу RESTful WCF, которая прекрасно работает при запуске в VS.

[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json, 
    UriTemplate = "/sales/start={start}&end={end}")]
List<Sales> GetSalesByDate(string start, string end);

Однако при развертывании этого на моем тестовом сервере (под управлением Win2K3 и IIS6) я получил следующую ошибку сервера:

Операция 'GetSalesByDate' в контракте 'ISalesService' использует GET, но также имеет параметр тела 'start'. Операции GET не могут иметь тела. Либо сделайте параметр start значением UriTemplate, либо переключитесь с WebGetAttribute на WebInvokeAttribute.

Очевидно, я уже запустил UriParameter. Так может кто-нибудь сказать мне, почему выбрасывается исключение?

EDIT: Для справки, вот мой файл конфигурации:

<?xml version="1.0"?>
<configuration>
    <system.serviceModel>
        <services>
            <service name="Services.SalesService">
                <endpoint behaviorConfiguration="webBehavior" 
                          binding="webHttpBinding" 
                          contract="Services.ISalesService"/>
            </service>
        </services>
        <behaviors>
            <endpointBehaviors>
                <behavior name="webBehavior">
                    <webHttp/>
                </behavior>
            </endpointBehaviors>
        </behaviors>
    </system.serviceModel>
</configuration>

Ответы [ 3 ]

10 голосов
/ 13 февраля 2009

Оказывается, /sales/start={start}&end={end} не является действительным Ури (да!). После небольшой проб и ошибок я наконец понял это. Настройка UriTemplate с помощью «?» решил проблему.

[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json, 
    UriTemplate = "/sales/?start={start}&end={end}")]
List<Sales> GetSalesByDate(string start, string end);

Спасибо за вашу помощь!

4 голосов
/ 16 декабря 2011

Я знаю, что уже поздно, но почему вы не использовали следующий формат.

UriTemplate = "/sales/{start}/{end}"
0 голосов
/ 13 февраля 2009

Бьюсь об заклад, это то, что на компьютере разработчика есть SP1, а на сервере нет.

http://blogs.msdn.com/endpoint/archive/2008/08/22/rest-in-wcf-part-ix-controlling-the-uri.aspx

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