2012-05-06 27 views
8

Podczas tworzenia usługi WCF Rest zauważyłem, że nie wszystkie parametry w moim serwisie internetowym wchodzą do mojej implementacji.Nie wszystkie parametry zawarte w kontrakcie danych WCF przechodzą przez wywołanie usługi internetowej

Oto interfejs:

[ServiceContract(Namespace="http://example.com/recordservice")] 
public interface IBosleySchedulingServiceImpl 
{ 
    [OperationContract] 
    [WebInvoke(UriTemplate = "Record/Create", 
     RequestFormat = WebMessageFormat.Xml, 
     ResponseFormat = WebMessageFormat.Xml, 
     BodyStyle = WebMessageBodyStyle.Bare, Method = "POST")] 
    string CreateRecord(Record record); 
} 

[DataContract(Namespace="http://example.com/recordservice")] 
public class Appointment 
{ 
    [DataMember] 
    public int ResponseType { get; set; } 

    [DataMember] 
    public int ServiceType { get; set; } 

    [DataMember] 
    public string ContactId { get; set; } 

    [DataMember] 
    public string Location { get; set; } 

    [DataMember] 
    public string Time { get; set; }   
} 

olewam ten XML w:

<Appointment xmlns="http://ngs.bosley.com/BosleySchedulingService"> 
    <ContactId>1123-123</ContactId> 
    <Location>Fresno</Location> 
    <Time>2012-05-05T08:30:00</Time> 
    <ResponseType>45</ResponseType> 
    <ServiceType>45</ServiceType> 
</Appointment> 

W mojej służbie, ja tylko wpisywanie wartości do dziennika, więc mogę zweryfikować wartości na razie przychodzą:

logger.Debug("ContactId: " + appointment.ContactId); 
logger.Debug("Time Field: " + appointment.Time); 
logger.Debug("Location: " + appointment.Location); 
logger.Debug("Response Type: " + Convert.ToInt32(appointment.ResponseType)); 
logger.Debug("ServiceType: " + Convert.ToInt32(appointment.ServiceType)); 

Jednak w moich wynikach wartości całkowite pojawiają się jako ze i roes:

ContactId: 1123-123 
Time Field: 2012-05-05T08:30:00 
Location: Fresno 
Response Type: 0 
ServiceType: 0 

Po usunięciu ciągów z DataContract i implementacji usługi, wartości całkowite przechodzą bez problemu.

Response Type: 45 
ServiceType: 45 

Jestem całkowicie zdezorientowany, a każda pomoc zostanie bardzo doceniona.

+0

Jakiś konkretny powód, dla którego jawnie konwertujesz swoje liczby całkowite na Int32? – Satyajit

+0

Zacznijmy od zapomnienia konwersji na liczbę całkowitą, i po prostu wypisz 'ResponseType' i' ServiceType' do rejestratora jako puste ciągi. –

+0

ConvertTo było po prostu próbą ustalenia, czy moje wartości zostały utracone z powodu nieprawidłowego rzutowania ze strony implementacji usługi. Teraz, kiedy mogę uzyskać wartości używając poniższej odpowiedzi, po prostu pozwolę im używać metody ToString, tak jak zwykle. W każdym razie dzięki. –

Odpowiedz

12

Domyślnie przy wysyłaniu obiektu przez wcf, właściwości będą wysyłane w kolejności alfabetycznej, chyba że zostanie podana kolejność.

Możesz określić kolejność właściwości lub zmienić kolejność, aby były wyświetlane w kolejności alfabetycznej.

[DataContract(Namespace="http://example.com/recordservice")] 
public class Appointment 
{ 
    [DataMember(Order = 1)] 
    public int ResponseType { get; set; } 

    [DataMember(Order = 2)] 
    public int ServiceType { get; set; } 

    [DataMember(Order = 3)] 
    public string ContactId { get; set; } 

    [DataMember(Order = 4)] 
    public string Location { get; set; } 

    [DataMember(Order = 5)] 
    public string Time { get; set; }   
} 
+0

Jak to jest istotne? –

+0

Jeśli właściwości nie zostaną wysłane we właściwej kolejności, to nie zostaną wypełnione, gdy zostaną wysłane do usługi. – SCB

+1

Czy pojawią się one we właściwościach, które zostaną zapełnione w niewłaściwym gnieździe? A może po prostu zapełni te, które ma? Wydaje się dziwnym wymogiem dla usługi sieciowej. –

Powiązane problemy