2010-07-01 30 views
8

Visual Studio 2010 kullanıyorum diyor bile olsa, Listesinin yerine Diziler kullanıyor ve oluşturduğumuz bir web hizmetine hizmet başvurusu aldım. Yöntemlerimiz jenerik Liste özelliklerini içeren nesneleri döndürmek: Hizmet referans ayarlarına On Service Reference, Liste

[System.ServiceModel.MessageBodyMemberAttribute(Namespace="SomeNamespace", Order=0)] 
[System.Xml.Serialization.XmlArrayAttribute(IsNullable=true)] 
[System.Xml.Serialization.XmlArrayItemAttribute(Namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays", IsNullable=false)] 
public int[] IntValues; 

: istemci tarafında

public class ExampleResponse 
{ 
    private System.Collections.Generic.List<int> intValues; 

    [WCF::MessageBodyMember(Name = "IntValues")] 
    public System.Collections.Generic.List<int> IntValues  
    { 
    get { return intValues; } 
    set { intValues= value; } 
    } 
} 

, bu int [] yerine listesi ile References.cs dosya oluşturur Koleksiyon Türü, Dizileri değil, Listeyi kullanmak üzere ayarlanmıştır. Yine de, hala öyle.

Bunun nasıl çözüleceğine dair herhangi bir bilgi son derece yararlı olacaktır, hiçbir anlam ifade etmemektedir.

cevap

9

"Hizmet Başvurusu" veya "Web Referansı" eklediniz mi? Proxy'nin DataContractSerializer yerine XmlSerializer ile oluşturulduğu anlaşılmaktadır. DataContractSerializer kullanıldıysa, Xml.Serialization ... öznitelikleri yerine System.Runtime.Serialization ... Öznitelikleriniz olur. Bu web referansını tam olarak nasıl oluşturdunuz? Güncellenmiş XmlSerializer, tüm koleksiyonları Arrays'e dönüştürecek, Datacontract serializer ise .Net DataTypes'i nasıl üreteceğini biliyor. Web Referansı Ekle XmlSerializer BTW'yi kullanır.

Ayrıca, MessageBodyMember kullanımınızı merak ediyorum. Neden kendi MessageContracts'ınızı oluşturmaya çalışıyorsunuz? Özellikle ne yaptığınızı bilmiyorsanız MessageContracts ile mesajlaşma çok tehlikeli olabilir.

[DataContract] 
public class ExampleResponse 
{ 
    private System.Collections.Generic.List<int> intValues; 

    [DataMember] 
    public System.Collections.Generic.List<int> IntValues 
    { 
     get { return intValues; } 
     set { intValues = value; } 
    } 
} 

sizin için nasıl çalıştığını görün ve bize bildirin:

Bunun yerine, aşağıdakileri deneyin.

+0

Referans, projeye sağ tıklanarak ve "Servis Referansı Ekle ..." seçilerek oluşturuldu. Web servisini bulmak için iletişim kurulduktan sonra, alttaki Web Referans seçeneğini seçmiyorum. Yaptığınız diğer öneriyi kontrol edeceğim, ancak bu son zamanlara kadar çalışıyordu - "miras aldığımız" bir web servisinden. – Grandpappy

+1

Tamam, anladım. Yorumun beni daha önce düşünmediğim bir yoldan gönderdi. DataContract özniteliği olmayan bir enum vardı, bu yüzden VS2010 bana söylemeden bir WebReference oluşturuyordu. Ayrıca, kendi mesaj sözleşmelerimizi ele alma konusunda ne söylediğinizi anlıyorum, çirkin. – Grandpappy

+0

Sevindim Yardımcı olabilirim. Mutlu Kodlama – CkH

2

Hizmet Ekleme Referansında, Koleksiyonlar için hangi türlerin kullanılacağını seçebilirsiniz. Bazı nedenlerle Array varsayılan. Bunu değiştirdikten sonra, tüm referansı silmem ve listeyi en baştan seçerek tekrar eklemem gerekiyordu. Gerektikten sonra garip sorunları değiştirdim.

+2

Tam olarak bunu yaptım, Toplama değerini ayarlayabilmemiz için referans değerini bile oluşturabiliriz. Ama hala diziler alıyorum. – Grandpappy