Параметры запроса не могут быть применены к запрашиваемому ресурсу - PullRequest
1 голос
/ 09 января 2012

Я создал очень простой веб-проект .NET 4.0 с клиентом WPF.

В веб-решении имеется служба данных WCF с операцией службы, возвращающей IQueryable<string>.

* 1005.* Клиент WPF ссылается на эту службу и вызывает операцию службы напрямую, используя CreateQuery() и .Take() непосредственно в запросе.

К сожалению, я получаю следующее сообщение об ошибке:

Query options $orderby, $inlinecount, $skip and $top cannot be applied to the requested resource.

Если я просматриваю сервис в браузере, используя http://localhost:20789/WcfDataService1.svc/GetStrings()?$top=3, я получаю ту же ошибку.

Есть идеи?Дайте мне знать, если мне нужно куда-нибудь загрузить решение.

Спасибо!

WcfDataService1.svc.cs:

namespace WPFTestApplication1
{
    [System.ServiceModel.ServiceBehavior(IncludeExceptionDetailInFaults = true)]
    public class WcfDataService1 : DataService<DummyDataSource>
    {
        public static void InitializeService(DataServiceConfiguration config)
        {
            config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
            config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
            config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
        }

        [WebGet]
        public IQueryable<string> GetStrings()
        {
            var strings = new string[]
            {
            "aa",
            "bb",
            "cc",
            "dd",
            "ee",
            "ff",
            "gg",
            "hh",
            "ii",
            "jj",
            "kk",
            "ll"
            };
            var queryableStrings = strings.AsQueryable();
            return queryableStrings;
        }
    }

    public class DummyEntity
    {
        public int ID { get; set; }
    }

    public class DummyDataSource
    {
        //dummy source, just to have WcfDataService1 working
        public IQueryable<DummyEntity> Entities { get; set; }
    }
}

MainWindow.xaml.cs: (WPF)

    public MainWindow()
    {
        InitializeComponent();

        ServiceReference1.DummyDataSource ds = new ServiceReference1.DummyDataSource(new Uri("http://localhost:20789/WcfDataService1.svc/"));
        var strings = ds.CreateQuery<string>("GetStrings").Take(3);

        //exception occurs here, on enumeration
        foreach (var str in strings)
        {
            MessageBox.Show(str);
        }
    }

1 Ответ

4 голосов
/ 09 января 2012

Службы данных WCF (и OData в том числе) не поддерживают обработку запросов для коллекций примитивных или сложных типов.Операция службы рассматривается не как IQueryable, а как IEnumerable.Вы можете добавить параметр в операцию сервиса, чтобы он возвращал вам только указанное количество результатов.

В спецификации это описывается так: Список URI - URI13 - это операция сервиса, возвращающая коллекцию примитивных типов.http://msdn.microsoft.com/en-us/library/dd541212(v=PROT.10).aspx А затем страница, описывающая параметры системного запроса: http://msdn.microsoft.com/en-us/library/dd541320(v=PROT.10).aspx В нижней части таблицы описывается, какие параметры запроса доступны для какого типа URI.URI13 разрешает только параметр запроса $ format.

...