2010-01-15 25 views
6

kullanırken 'System.Linq.Enumerable ...' türünde bir parametre serileştirilemiyor Bir WCF Hizmetim var. Bir Sözlük'ten seçmek için Linq nesnelerini kullanır. nesne türü basit:WCF, LINQ, JSON

public class User 
{ 
    public Guid Id; 
    public String Name; 
} 

bir Dictionary<Guid,User> saklanan koleksiyonu vardır.

Böyle bir WCF OperationContract yöntemine sahip istiyorum: O iyi derler

public IEnumerable<Guid> GetAllUsers() 
{ 
    var selection = from user in list.Values 
     select user.Id; 
    return selection; 
} 

, ancak bunu çalıştırdığınızda alıyorum:

Sunucu isteği işlerken bir hatayla karşılaştı. Kural dışı durum iletisi, '' System.Linq.Enumerable + WhereSelectEnumerableIterator 2[Cheeso.Samples.Webservices._2010.Jan.User,System.Guid]' (for operation 'GetAllUsers', contract 'IJsonService') because it is not the exact type 'System.Collections.Generic.IEnumerable 1 [System.Guid] 'türünde parametre imzasını seri hale getiremez ve bilinen türler koleksiyonunda yoktur. Parametreyi serileştirmek için, ServiceKnownTypeAttribute kullanarak işlem için bilinen türler koleksiyonuna yazın. '. Daha fazla bilgi için sunucu günlüklerine bakın.

Seçimi IEnumerable<Guid> olmak için nasıl zorlayabilirim? Bunu yapmak için kodunu değiştirmek durumunda


DÜZENLEME
, iyi çalışıyor - iyi çalışabilirliği.

public List<Guid> GetAllUsers() 
{ 
    var selection = from user in list.Values 
     select user.Id; 
    return new List<Guid>(selection); 
} 

beni List<T> yaratılması/örnekleme önlemek için bir yol var mı?

cevap

9

Hayır, bir web hizmetinden somut bir sınıf döndürmeliyiz. Dönüş tipi Listesini yapın ve onunla yapın.

1

Birlikte çalışabilir koleksiyonları WCF yöntemlerinden ve bunlardan geçirmeniz gerekir.

WCF, basit tür ve dizilerle en iyi sonucu verir.

İstemcinizden bir dizi geçirin ve sonra hizmette bir IEnumerable'a dönüştürün.

IEnumerable gibi şeyler, WCF'nin olmaya çalıştığı şey, birlikte çalışabilir değildir.

Bilinen türlerle etrafta dolaşmanın bir yolu olabilir, ancak her zaman bileşenlerimi olabildiğince esnek yapmaya çalışıyorum.

+0

Sanırım bir IEnumerable iletmeye çalışıyorum. Teslim etmek istediğim şey, Kılavuzların listesi. ama bunun gerçekleşmesi için gereksiz döküm yapmak istemedim. Aslında, yöntemin dönüş türünü yalnızca Liste listesine dönüştürebilir ve sonra listeyi Liste oluşturucuya geçiren yeni bir Liste oluşturabilirim - bu yalnızca iyi çalışır ve istemci listeyi istediğim gibi alır. Yeterince basit. Listesinin açık yaratılmasının gereksiz olacağını umuyordum. – Cheeso

+0

IEnumerable <> sadece bir arabirimdir ve yöntemin döndürdüğü IEnumerable <> özelliğini kullanan başlatılmış türüne bağlı olduğu için birlikte çalışabilir olmadığını söylemek tamamen doğru değildir. IEnumerable <> 'ı herhangi bir sorun olmadan servis işlemlerinden dönüş olarak kullandım, ancak anahtar operasyonun geri dönüş değerinin düzgün bir şekilde başlatılması gerektiğidir. – Kwal

+0

MattK - bir IEnumerable ile sonuçlanan bir sorguyu gerçekleştirmek için linq-to-nesnelerini WCF'ye maruz bırakılmış bir yöntemden dönebileceğim şekilde nasıl kullanabilirim? – Cheeso

4

ServiceKnownTypes özniteliğini kullanmanız gerekir.

using System; 
using System.Collections.Generic; 
using System.ServiceModel; 
using System.ServiceModel.Web; 

namespace Test.Service 
{ 
    [ServiceContract(Name = "Service", Namespace = "")] 
    public interface IService 
    { 
     [OperationContract] 
     [WebInvoke(
      Method = "GET", 
      BodyStyle = WebMessageBodyStyle.WrappedRequest, 
      RequestFormat = WebMessageFormat.Json, 
      ResponseFormat = WebMessageFormat.Json)] 
     [ServiceKnownType(typeof(List<EventData>))] 
     IEnumerable<EventData> Method(Guid userId); 
    } 
} 

Temelde size iade şeyin somut türünü bilmemiz gerekir. Gayet basit.

+0

+1 Daha zarif bir çözüm için – Basic