2009-03-23 13 views
20

Piszę moją pierwszą usługę WCF. Postanowiłem napisać tę usługę, tak jak na początku DLL, a potem przejrzeć zawartość WCF, która jest teraz, gdzie jestem teraz.WCF: MessageContract, DataContract ... Confused?

Zostałem poinformowany przez architekta, że ​​powinienem trzymać się określonego formatu dla obiektów wiadomości, które zrobiłem. Jednak w moich obiektach wiadomości użyłem interfejsów, typów złożonych i ich list. Zamierzam dodać atrybuty i jestem trochę zdezorientowany.

Oto przykład pokazujący mój kod.

[ServiceContract] 
public interface MyServiceContract 
{ 
    [OperationContract] 
    MyMethodResponseMessage MyMethod(MyMethodRequestMessage request); 
} 

public class MyService : MyServiceContract 
{ 
    public MyMethodResponseMessage MyMethod(MyMethodRequestMessage request) 
    { 
     //Do things 
    } 
} 

//Messages 
[MessageContract] 
public class MyMethodResponseMessage 
{ 
    [MessageBodyMember] 
    public MyMethodResponse Body { get; set; } 
} 

[DataContract] 
public class MyMethodResponse 
{ 
    [DataMember] 
    public IMyComplexTypeItem { get; set; } 

    [DataMember] 
    public List<IMyComplexType> Items { get; set; } 

    [DataMember] 
    public bool Success { get; set; } 
} 

//DTO  
public interface IMyComplexType 
{ 
    [DataMember] 
    string Identity { get; set; } 
} 

[DataContract] 
public class MyComplexType1 : IMyComplexType 
{ 
    [DataMember] 
    public virtual string Identity 
} 

Czy każdy może komentować poprawność w użyciu MessageContract, DataContract, DataMember i Serializable itp? Jakieś wskazówki lub rażące błędy?

Który serializer jest najlepszy do użycia? i jaka jest najlepsza strategia, aby zapewnić, że otrzymam dobrze sformatowany XML z tego, aby inni klienci mogli łatwo korzystać z mojej usługi?

Odpowiedz

15

Do żądania/odpowiedzi - [DataContract] będzie działać równie dobrze. Jedną z zalet umów z wiadomościami jest to, że możesz ustawić prywatność przeciwko członkom, ale w wielu przypadkach nie jest to konieczne. W takich przypadkach wolę utrzymać umowę tak prostą, jak to tylko możliwe, tak jak umowę dotyczącą danych.

Re, który serializator - jest w dużej mierze czynnikiem konfiguracji. Domyślnie przez http, na przykład, będzie to DataContractSerializer.

Nie jestem jednak pewien, czy lista IMyComplexType będzie działać bardzo dobrze. Możesz spróbować, ale generalnie chce konkretnych typów. Zauważ, że w klasach bazowych możesz użyć [KnownType], aby określić dozwolone podtypy.

Należy zauważyć, że w przeciwieństwie do XmlSerializer, nie jest wymagane, aby elementy kolekcji miały setery - chociaż może być konieczne dodanie metody wywołania zwrotnego OnDeserializing w celu zainicjowania listy, jeśli to zrobisz (WCF nie wywołuje konstruktorów).

Poza tym: można również używać protobuf-net z kontraktami danych i WCF (o ile mają one wyraźne Zamówienie); jest to bardziej gęsto upakowane niż zwykły xml. W tej chwili nie ma jednak wsparcia dla kontraktów z wiadomościami.

+0

Dzięki Marc, masz rację o klasie Base. Działa to trochę lepiej. Rzucę okiem na metodę OnDeserializing, okrzyki na ten temat. Jestem ograniczony do Xml dla tego projektu. –

2

Choć nie jest to bezpośrednia odpowiedź na to pytanie, warto wziąć pod uwagę następujące kwestie z MSDN -Using Message Contracts

Każdy nagłówek wiadomości i treść wiadomości częścią jest seryjny (przekształcony XML) przy użyciu wybranego serializacji silnik do umowy o świadczenie usług, w której wykorzystywany jest komunikat. Silnik domyślne serializacji The XmlFormatter, może obsługiwać dowolny typ, który ma kontrakt danych albo explicite (poprzez system. Runtime. Serializacji. DataContractAttribute) lub dorozumiany (będąc prymitywny typ, mając the System.SerializableAttribute, i tak dalej).

enter image description here

Powiązane problemy