2010-07-27 13 views
7

Tengo un método de servicio WCF bastante simple que devuelve un IQueryable, solo para probar. Quizás me equivoqué al tratar de entender para qué está diseñado IQueryable. Claramente planeo usar esto con el proveedor IQueryable de NHibernate más adelante. Pero primero me encontré con algún tipo de problema de serialización (al menos creo que podría ser el problema) cada vez que uso un método WCF devolviendo un IQueryable. Ni siquiera funciona para una cadena simple.Problemas de IQueryable con WCF

Aquí está mi código:

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

Puede que no tenga mucho sentido, es sólo para comprobar si realmente conseguir esos IQueryables a través del cable utilizando WCF. Cada vez que llamo a este método usando un cliente como SoapUI obtengo una excepción de socket y un restablecimiento de conexión, exactamente como si estuviera tratando de devolver algo que no está marcado como DataContract. Pero lo único que hago aquí es intentar devolver una lista de cuerdas pésima. ¿Qué está mal con eso?

utilizo basicHttpBinding, aquí están mis ajustes:

<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> 

El atributo OperationContract está establecido para la interfaz:

[OperationContract] 
IQueryable<string> GetEquipmentConfigurations(); 

Todo funciona bien cuando acaba de regresar de una cadena simple. De todos modos, quiero aprovechar las características de IQueryable usando LINQ más tarde.

¿Alguien alguna idea de lo que está mal aquí?

Gracias y Saludos,

Stefan

+0

Si publica código o XML, ** por favor ** resalte esas líneas en el editor de texto y haga clic en el botón "código" (101 010) en la barra de herramientas del editor para formatear y resaltar la sintaxis. –

Respuesta

5

(obsoleto) yo sepa, no es posible fuera de la caja para serializar IQueryable <> o árboles de expresión (piensa en ello - que significaría que la expresión tree/lambda necesitaría ser serializada y la función reconstruida)

Sin embargo, cuando hay un testamento, parece que hay una manera - es posible que desee ver proyectos como este http://code.msdn.microsoft.com/exprserialization

Editar: Tenga en cuenta que los tiempos han cambiado - Consulte WCF RIA Services según la publicación de Marc Gravell.

¡Buena suerte!

HTH

+0

Está bien, pero no entiendo cómo funcionan los servicios de WCF Ria: parecen estar usando IQueryables y exponiéndolos al cliente utilizando algún tipo de técnica de servicio web. ¿Cómo manejan esto? Por lo que yo entendí, este fue uno de los principales beneficios de los servicios de WCF Ria, tunelizar las consultas LINQ del cliente a través de un servicio web hasta el motor de serialización ...? – Pilsator

+0

Marc Gravell es correcto. El proxy WCF Ria Services (ahora llamado Data Services) implementa IQueryable localmente, serializa la expresión, la envía a IQueryable en el otro extremo y la ejecuta allí, luego vuelve a proxy los resultados. –

10

El núcleo WCF está diseñado para enviar los datos , no consultas. Se adhieren a devolver List<Foo> etc; te ahorrará muchos arañazos en la cabeza.

Sin embargo, puede tener más suerte haciendo lo que está buscando con WCF Data Services, que le permite exponer IQueryable<> fuentes.

La forma en que esto funciona es que la herramienta construye un cliente que expone similar buscandoIQueryable<> ganchos; cuando consulta datos, representa la expresión en el cable, consulta los datos y los devuelve al cliente. Pero sigue siendo el resultados (no la consulta) que va por el cable.

Cuestiones relacionadas