2010-07-27 4 views
7

У меня довольно простой метод службы WCF, который возвращает IQueryable, только для тестирования. Возможно, у меня что-то не так, когда я пытаюсь понять, для чего предназначен IQueryable. Я четко планирую использовать это с провайдером IQueryable NHibernate позже. Но сначала я столкнулся с некоторыми проблемами сериализации (по крайней мере, я думаю, это может быть проблемой) при использовании метода WCF, возвращающего IQueryable. Это даже не работает для простой строки.IQueryable проблемы с использованием WCF

Вот мой код:

public IQueryable<string> GetEquipmentConfigurations() 
{ 
    var returnValue = new List<string>(); 
    returnValue.Add("test"); 
    return returnValue.AsQueryable(); 
} 

Это может не иметь особого смысла, это только для тестирования, действительно ли я получить эти IQueryables по проводам с использованием WCF. Всякий раз, когда я вызываю этот метод с помощью клиента, такого как SoapUI, я получаю исключение сокета и сброс соединения, точно так же, как если бы я пытался вернуть что-то, что не помечено как DataContract. Но единственное, что я здесь делаю, это попытка вернуть какой-то паршивый список строк. Что в этом плохого?

Я использую BasicHttpBinding, вот мои настройки:

<system.serviceModel> 
    <services> 
     <service name="EquipmentConfigurationService" behaviorConfiguration="DefaultBehavior"> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:8000/Krones.KBase/Services/EquipmentConfigurationService"/> 
      </baseAddresses> 
     </host> 
     <endpoint address="" 
        binding="basicHttpBinding" 
        contract="Krones.MES.KBase.Public.Service.EquipmentDefinition.IEquipmentConfigurationService" /> 
     <endpoint address="mex" 
        binding="mexHttpBinding" 
        contract="IMetadataExchange" /> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="DefaultBehavior"> 
      <serviceMetadata httpGetEnabled="True"/> 
      <serviceDebug includeExceptionDetailInFaults="True"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
</system.serviceModel> 

Атрибут OperationContract установлен для интерфейса:

[OperationContract] 
IQueryable<string> GetEquipmentConfigurations(); 

Это все работает хорошо, когда просто возвращает простую строку. В любом случае, я хочу получить прибыль от функций IQueryable, используя LINQ позже.

Кто-нибудь знает, что здесь не так?

Спасибо и Cheers,

Стефан

+0

Если вы отправляете код или XML, ** пожалуйста ** выделите эти строки в текстовом редакторе и нажмите кнопку «код» (101 010) на панели инструментов редактора, чтобы красиво отформатировать и выделить синтаксис! –

ответ

5

(Устаревшая) AFAIK это не представляется возможным из коробки сериализовать IQueryable <> или Expression Trees (об этом думать - это будет означать, что дерево выражений/lambda необходимо будет сериализовать и функция перестроена)

Однако, когда есть завещание, кажется, что есть способ - вы можете посмотреть такие проекты, как этот http://code.msdn.microsoft.com/exprserialization

Редактировать: Обратите внимание, что время изменилось - см. Службы WCF RIA в соответствии с постами Марка Гравелла.

Удачи вам!

НТН

+0

ОК, но тогда я не понимаю, как работают службы WCF Ria - они, похоже, используют IQueryables и выставляют их клиенту, используя какой-то метод webservice. Как им это удается? Насколько я понял, это было одним из основных преимуществ услуг WCF Ria, чтобы туннелировать запросы LINQ от клиента через веб-сервис до механизма сериализации ...? – Pilsator

+0

Марк Гравелл прав. WCF Ria Services (теперь называемый Data Services) proxy реализует IQueryable локально, сериализует выражение, отправляет его в IQueryable на другом конце и выполняет там, затем прокси возвращает результаты. –

10

Ядро WCF предназначен для отправки данных, а не запросы. Придерживайтесь возврата List<Foo> и т. Д .; это сэкономит вам много царапин на голове.

Однако, возможно, вам повезло с тобой, что вы после этого с WCF Data Services, что позволяет вам выявлять источники IQueryable<>.

Способ, которым это работает, заключается в том, что оснастка создает клиента, который предоставляет аналогичный видIQueryable<> крючки; при запросе данных он представляет собой выражение на проводнике, запрашивает данные и возвращает его клиенту. Но это все еще результаты (а не запрос), который проходит по проводу.

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