Po pierwsze, nie jest wymagane dostarczenie DataContract; WCF będzie poprawnie serializować zwykłe stare obiekty klas (POCO) tak długo, jak długo będziesz na .Net 3.5 SP1 lub nowszym.
Po drugie, można udostępniać ten sam plik klasy fizycznej w projektach po stronie serwera i klienta; mamy projekty, które mają setki klas (i kodu), które są bezpośrednio udostępniane w ten sposób i oszczędza ogromną ilość czasu i wysiłku w rozwoju i testowaniu.
Istnieje kilka etapów wymaganych, aby uzyskać ten uruchomiony (robi to z pamięci, więc może trzeba dostosować odpowiedź):
1) po stronie klienta, jeśli używasz VB, stworzyć projekt w tej samej domyślnej przestrzeni nazw co klasy, które chcesz użyć po stronie klienta (dla języka C# to nie jest ważne, ponieważ przestrzeń nazw jest osadzona w klasach).
2) Dodaj pliki zajęć do projektu jako odnośniki, aby mieć jedną fizyczną kopię tej klasy.
3) Dodaj dataContractSerializer do konfiguracji WCF, jeśli jeszcze jej nie masz.
4) Po stronie klienta kliknij prawym przyciskiem myszy usługę i wybierz polecenie Skonfiguruj odniesienie do usługi ... W wyświetlonym oknie dialogowym sprawdź, czy jest zaznaczone Reuse types in all referenced assemblies
i czy wybrana jest opcja Reuse types in all referenced assemblies
.
5) Najtrudniejszą rzeczą do uzyskania tej pracy są kolekcje.
a) Udekoruj kolekcję atrybutem CollectionDataContract.
b) Dodaj wpis dotyczący tej kolekcji do tabeli reference.svcmap
o numerze CollectionMappings
. Aby znaleźć plik reference.svcmap, pokaż wszystkie pliki w projekcie, a następnie rozwiń usługę. Aby go edytować, wystarczy dwukrotnie kliknąć plik.Tutaj dodasz wpis dla każdej konkretnej kolekcji, która jest serializowana, i musisz rozróżnić te elementy, które mają Bazę <> i te, które mają Bazę Słownika <>. Jeśli nie wykonasz tego kroku, WCF automatycznie serializuje te klasy z podstawowym ogólnym podpisem, a stracisz korzystanie ze swoich klas.
Wpisy w tej tabeli wyglądać następująco:
<CollectionMappings>
<CollectionMapping TypeName="System.Collections.Generic.Dictionary`2" Category="Dictionary" />
<CollectionMapping TypeName="System.Collections.Generic.List`1" Category="List" />
<CollectionMapping TypeName="System.Collections.Specialized.StringCollection" Category="List" />
<CollectionMapping TypeName="My.Namespace.MyDictionaryCollection" Category="Dictionary" />
Po dodaniu tych wpisów i zapisać plik, generator po stronie klienta WCF będzie odbudować reference.cs lub plik reference.vb zależności od z jakiego języka korzystasz. Możesz sprawdzić, czy nie masz poprawnie skonfigurowanych referencji, patrząc na wygenerowany kod: jeśli ten kod zawiera definicje klas, generator kodu WCF nie mógł z jakiegoś powodu mapować na skopiowane klasy.
Ostatnia uwaga: czasami generator kodu WCF kompletnie nie generuje kodu i jest to zawsze spowodowane problemem w usłudze (zazwyczaj klasa nie jest wystarczająco unikatowa lub typ nie może być serializowany dla jednego z tego czy innego powodu).
W celu debugowania tego typu problemu, najłatwiejszym rozwiązaniem jest dodanie rejestrowania diagnostycznego WCF, które wygeneruje plik, który można otworzyć za pomocą specjalnego narzędzia (zapomnieć o jego nazwie), które pozwala na drążenie w komunikaty o błędach i odkryj dokładnie, co poszło nie tak. To uratowało nam niezliczone godziny pracy. Aby skonfigurować tę rejestrację, należy dodać następujące do pliku web.config w dowolnym miejscu w sekcji <configuration>
:
<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="Information, ActivityTracing"
propagateActivity="true">
<listeners>
<add name="traceListener"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData="c:\log\WcfTrace.svclog" />
</listeners>
</source>
</sources>
</system.diagnostics>
Po dodaniu tego i zapisywane Web.config próbę zaktualizowania odniesienia serwisowa w kliencie, a następnie dwukrotnie kliknij określony plik dziennika, a narzędzie otworzy się.