2011-08-03 12 views
6

Oto metoda podpis w służbie WCF:Przedmiotem WCF Serialized Lista dając dziwne nazwy obiektów

APIMessageList<APISimpleContact> GetMembers(string apiKey, APIContactSearchFilter filter); 


APIMessageList dziedziczy z IList. Po utworzeniu proxy dla tej usługi WCF nazwa klasy to APIMessageListOfAPISimpleContactjHldnYZV.

Dlaczego nie mogę dostać: APIMessageListOfAPISimpleContact?

Dodaje losowy tekst na końcu każdego obiektu APIMessageList w interfejsie (jest ich kilka). Wszystkie one kończą się tymi samymi kilkoma znakami - jHldnYZV. Szukałem w Internecie możliwych przyczyn, ale nie mogę znaleźć żadnych postów osób mających ten problem.

Jest to problem czysto kosmetyczny, ale interfejs ten jest wystawiony na kontakt z klientami zewnętrznymi, dlatego jego wygląd jest ważny.

Ktoś wie, dlaczego dostaję ten problem?

Dziękujemy
Joe

+0

Czy możesz podać atrybut kontraktu operacyjnego z umowy serwisowej? –

Odpowiedz

0

Mieliśmy podobny problem podczas korzystania z głównych rodzajów dla wartości zwracanych. Jeśli nie określamy konkretnego typu, domyślny serializator danych lub serializator WCF nie jest w stanie określić dokładnego typu zwracanej jednostki. Dlatego generuje losową nazwę klasy dla zwróconego typu.

W naszym projekcie przezwyciężyliśmy ten problem, tworząc umowę danych, która była określonego typu i zwrócona to samo w wyniku wywołania operacji WCF.

Domyślam się, że używasz typowego typu, a serializator nie może określić typu zwracanego obiektu.

Proponuję utworzyć obiekt przenoszenia danych (DTO) i zwrócić go z usługi WCF. To powinno rozwiązać twój problem.

+1

Ustawianie reguł serializacji dla generycznych jest opisane w linku podanym w @ carlosfigueira - wystarczy nadać mu taki szablon; '[DataContract (Name =" Drawing_using_ {1} _brush_and_ {0} _shape ")] public class Rysunek { // Kod nie jest wyświetlany. } ' – Shawson

+0

ps. dlaczego formatowanie w komentarzach jest tak banalne na tej stronie !!? – Shawson

7

Twoje rozwiązanie będzie dostępne pod adresem http://msdn.microsoft.com/en-us/library/ms731045.aspx. Zasadniczo, ponieważ możesz mieć wiele klas "SimpleContract" (w różnych przestrzeniach nazw), WCF doda haśle ujednoznaczniającą na końcu nazwy kontraktu, co masz w 8 znakach na końcu nazwy kontraktu. Ale możesz to kontrolować, korzystając z właściwości CollectionDataContract i jej nazwy:

[CollectionDataContract(Name = "APIMessageListOfSimpleContract")] 
public class APIMessageList : IList<SimpleContract> { ... } 
Powiązane problemy