2012-01-09 2 views
1

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

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

Клиент 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); 
     } 
    } 

ответ

4

WCF Data Services (и 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 разрешает только вариант запроса формата $.

+0

Спасибо! У вас есть ссылки на это, поэтому мы можем добавить его в ответ? –

+0

Обновлен ответ со ссылками на спецификацию. –

Смежные вопросы