2010-07-27 11 views
7

Ich habe eine recht einfache WCF-Service-Methode, die eine IQueryable, nur zum Testen zurückgibt. Vielleicht habe ich etwas falsch gemacht, wenn ich versucht habe zu verstehen, wofür IQueryable entwickelt wurde. Ich plane klar, dies später mit dem IQueryable-Provider von NHibernate zu verwenden. Aber zuerst stieß ich auf einige Serialisierungsprobleme (zumindest denke ich, dass es das Problem sein könnte), wann immer ich eine WCF-Methode benutze, die ein IQueryable zurückgibt. Es funktioniert nicht einmal für eine einfache Zeichenfolge.IQueryable Probleme mit WCF

Hier ist mein Code:

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

Es ist vielleicht nicht viel Sinn haben, es ist nur zum Testen, ob ich wirklich diese IQueryables über den Draht mit WCF erhalten. Wann immer ich diese Methode mit einem Client wie SoapUI aufrufen, bekomme ich eine Socket-Ausnahme und eine Verbindung zurückgesetzt, genau so, als ob ich etwas zurückgeben wollte, das nicht als DataContract markiert ist. Aber das einzige, was ich hier mache, ist, eine lausige String-Liste zurückzugeben. Was stimmt damit nicht?

I Basichttpbinding verwenden, hier sind meine Einstellungen:

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

Das Operation Attribut ist für die Schnittstelle eingestellt:

[OperationContract] 
IQueryable<string> GetEquipmentConfigurations(); 

Alles gut funktioniert, wenn nur eine einfache Zeichenfolge zurück. Jedenfalls möchte ich später von den IQueryable-Funktionen mit LINQ profitieren.

Jeder eine Idee, was hier schief läuft?

Dank und Beifall,

Stefan

+0

Wenn Sie Code oder XML posten, ** bitte ** markieren Sie diese Zeilen im Texteditor und klicken Sie auf die Schaltfläche "Code" (101 010) auf der Editor-Symbolleiste, um schön formatieren und Syntax markieren Sie es! –

Antwort

5

(veraltet) AFAIK ist es nicht möglich, aus der Box IQueryable serialisiert <> oder Expression Trees (denken Sie darüber - es würde bedeuten, dass der Ausdruck tree/lambda müsste serialisiert werden und die Funktion müsste neu aufgebaut werden)

Aber wo ein Wille ist, scheint es einen Weg zu geben - vielleicht möchten Sie sich Projekte wie diese anschauen http://code.msdn.microsoft.com/exprserialization

Bearbeiten: Beachten Sie, dass sich die Zeiten geändert haben - Siehe WCF RIA Services nach Marc Gravells Beitrag.

Viel Glück!

HTH

+0

OK, aber ich verstehe nicht, wie die WCF Ria-Dienste funktionieren - sie scheinen IQueryables zu verwenden und sie mit einer Art Webservice-Technik dem Client zur Verfügung zu stellen. Wie schaffen sie das? Soweit ich das verstanden habe, war dies einer der Hauptvorteile von WCF Ria-Diensten, die LINQ-Abfragen vom Client über einen Webservice bis zur Serialisierungs-Engine zu tunneln ...? – Pilsator

+0

Marc Gravell hat Recht. WCF Ria Services (jetzt als Data Services-Proxy bezeichnet) implementiert IQueryable lokal, serialisiert den Ausdruck, sendet ihn an das andere Ende des IQueryable und führt ihn dort aus. –

10

Der WCF Kern Daten, keine Abfragen senden ausgelegt ist. Bleiben Sie zurück List<Foo> etc; es wird dir viel Kopfkratzen ersparen.

Sie könnten jedoch mehr Glück haben, was Sie mit WCF Data Services, die Sie IQueryable<> Quellen ausgesetzt tun können.

Die Art, wie dies funktioniert, ist, dass das Tooling einen Client erstellt, der ähnlich aussiehtIQueryable<> Haken; Wenn Sie Daten abfragen, stellt es den Ausdruck auf dem Draht dar, fragt die Daten ab und bringt sie zurück zum Client. Aber es ist immer noch die Ergebnisse (nicht die Abfrage), die über die Leitung geht.