2010-07-01 6 views
8

Używam programu Visual Studio 2010 i mam odniesienie do usługi do usługi sieciowej, którą utworzyliśmy. Nasze metody wrócić obiektów, które zawierają ogólne właściwości Wypis:Odwołanie do usługi korzysta z tablic zamiast z listy <Type>, nawet jeśli ustawienia mówią o użyciu listy

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

Na stronie klienta, to tworzy plik References.cs z int [] zamiast listy:

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

od ustawień referencyjnych usług Typ kolekcji jest ustawiony do używania Listy, a nie Tablic. Jednak wciąż to robi.

Wszelkie informacje na temat sposobu rozwiązania tego problemu byłyby niezwykle pomocne, wydaje się, że nie ma to sensu.

Odpowiedz

9

Czy dodano "Informację o usługach" lub "Odniesienie do strony internetowej"? Wygląda na to, że proxy zostało wygenerowane za pomocą XmlSerializer zamiast DataContractSerializer. Jeśli został użyty DataContractSerializer, miałbyś atrybut System.Runtime.Serialization ... Atrybuty zamiast atrybutów Xml.Serialization .... Jak dokładnie wygenerowałeś ten odnośnik do internetu? Zaktualizowany XmlSerializer skonwertuje wszystkie zbiory na Arrays, gdzie jako Serializator Datacontract wie, jak wygenerować .Net DataTypes. Dodaj odwołanie do sieci Web korzysta z XWspomagania XmlSerializer.

Jestem także ciekawy, jak wykorzystujesz MessageBodyMember. Dlaczego próbujesz wygenerować własne Kontrakty Wiadomości? Wiadomości z MessageContracts mogą być bardzo niebezpieczne, szczególnie jeśli nie wiesz dokładnie, co robisz.

Zamiast tego, spróbuj wykonać następujące czynności:

[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; } 
    } 
} 

Zobacz jak to działa dla Ciebie i daj nam znać.

+0

Odwołanie zostało utworzone przez kliknięcie prawym przyciskiem myszy na projekcie i wybranie "Dodaj referencję usługi ...". Gdy pojawi się okno dialogowe w celu znalezienia usługi internetowej, nie wybieram opcji Odwołania do sieci u dołu. Sprawdzę inne sugestie, które miałeś, ale to działało do niedawna - pochodzi z usługi internetowej, którą "odziedziczyliśmy". – Grandpappy

+1

Dobra, rozumiem. Twój komentarz wysłał mnie na ścieżkę, o której wcześniej nie myślałem. Mieliśmy wyliczenie, które nie zawierało atrybutu DataContract, więc VS2010 tworzyło WebReference bez powiadamiania mnie. Rozumiem również, co mówisz o obsłudze naszych własnych umów z wiadomościami, jest brzydka. – Grandpappy

+0

Cieszę się, że mogę pomóc. Happy Coding – CkH

2

W polu Dodaj numer referencyjny usługi można wybrać typ, którego należy użyć w kolekcjach. Z jakiegoś powodu macierz jest domyślna. Po jego zmianie musiałem usunąć cały odnośnik i ponownie go dodać, wybierając List od początku. Miałem dziwne problemy, zmieniając to po fakcie.

+2

Zrobiłem to dokładnie, ustawiając wartość Collection, zanim będzie można utworzyć sam odnośnik. Ale wciąż otrzymuję tablice. – Grandpappy

Powiązane problemy