2012-05-06 10 views
8

Durante la creazione di un servizio di ripristino WCF, ho notato che non tutti i parametri del mio servizio Web stanno entrando nella mia implementazione.Non tutti i parametri nel contratto di dati WCF passano attraverso la chiamata al servizio Web

Ecco l'interfaccia:

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

sto passando questo XML in:

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

Nel mio servizio, sto solo l'emissione dei valori in un log in modo da poter verificare i valori stanno arrivando per il momento:

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

Tuttavia, nel mio output, i valori interi si stanno verificando come lattimi:

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

Quando rimuovo le corde dal DataContract e l'implementazione del servizio, i valori interi vengono attraverso senza un problema.

Response Type: 45 
ServiceType: 45 

Sono completamente confuso da questo e qualsiasi aiuto sarebbe molto apprezzato.

+0

Qualsiasi motivo specifico per cui si converte in modo esplicito i propri numeri interi in Int32? – Satyajit

+0

Iniziamo con la dimenticanza della conversione in numero intero, e solo l'output di 'ResponseType' e' ServiceType' nel logger come stringhe nude. –

+0

ConvertTo era solo un tentativo di determinare se i miei valori venivano persi a causa di un cast non corretto nella parte dell'implementazione del servizio. Ora che posso ottenere i valori usando la risposta qui sotto, lascerò che utilizzino il metodo ToString come faranno normalmente. Grazie comunque. –

risposta

12

Per impostazione predefinita, quando si invia un oggetto tramite wcf, le proprietà verranno inviate in ordine alfabetico, a meno che non si specifichi l'ordine.

È possibile specificare l'ordine delle proprietà o modificare l'ordine in modo che vengano visualizzati in ordine alfabetico.

[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

Com'è pertinente? –

+0

Se le proprietà non vengono inviate nell'ordine corretto, non verranno popolate quando vengono inviate al servizio – SCB

+1

Verrà visualizzato nelle proprietà che vengono popolate nello slot errato? O popolerà solo quelli che ha? Sembra uno strano requisito per un servizio web. –

Problemi correlati