2009-10-14 7 views
2

J'ai un service WCF avec une application cliente. J'ai un contrôle complet sur l'implémentation du client et du serveur. J'ai des centaines de méthodes dans le contrat WCF qui ont besoin d'une information fournie par le client. Au lieu de modifier des centaines de méthodes, y a-t-il un moyen d'envoyer des données spécifiques du client avec chaque appel au service, éventuellement quelque part dans le canal? Peut-être que lorsque le client configure le proxy avant de passer l'appel, il peut stocker ces données quelque part dans une propriété interne du proxy ... les données seraient ensuite envoyées au serveur et à partir de la méthode de service I pourrait inspecter le OperationContext ou un autre morceau de mémoire pour récupérer ces données et l'utiliser?WCF - Envoi de données au serveur en dehors du contrat

Des idées?

Répondre

1

Il semble que vous vouliez quelque chose comme des en-têtes comme avec les services web SOAP. Je ne suis pas un expert WCF, mais ce looks like the WCF equivalent.

0

Vous ne pouvez pas faire cela trivialement. Cela prendra du travail. Il est vrai que les en-têtes SOAP sont le moyen idéal pour transmettre des données hors bande vers et/ou à partir d'un service. Mais vous avez déjà défini votre contrat et l'ajout d'en-têtes changera le contrat. Je crois que vous devrez commencer à utiliser des contrats de message.

Original:

[DataContract] 
public class ComplexObject 
{ 
    [DataMember(Name = "Id")] 
    public int Id; 

    [DataMember] 
    public string Name; 
} 

[ServiceContract()] 
public interface IMyContract 
{ 
    void MyOperation(ComplexObject co); 
} 

public class MyService : IMyContract 
{ 
    #region Implementation of IMyContract 

    public void MyOperation(ComplexObject co) 
    { 
     // use co.* 
    } 

    #endregion 
} 

Utilisation des contrats de message:

[DataContract] 
public class ComplexObject 
{ 
    [DataMember(Name = "Id")] 
    public int Id; 

    [DataMember] 
    public string Name; 
} 

[DataContract] 
public class MyHeader 
{ 
    [DataMember] 
    public string UserName; 

    [DataMember] 
    public string Password; 
} 

[DataContract] 
public class OutputHeader 
{ 
    [DataMember] 
    public string Token; 
} 

[MessageContract] 
public class MyOperationRequest 
{ 
    [MessageHeader] 
    public MyHeader Authentication; 

    [MessageBodyMember] 
    public ComplexObject TheObject; 
} 

[MessageContract] 
public class MyOperationResponse 
{ 
    [MessageHeader] 
    public OutputHeader OutputHeader; 
} 

[ServiceContract()] 
public interface IMyContract 
{ 
    MyOperationResponse MyOperation(MyOperationRequest request); 
} 

public class MyService : IMyContract 
{ 
    public MyOperationResponse MyOperation(MyOperationRequest request) 
    { 
     // use request.TheObject.* 
     // Can also read request.Authentication.* 

     return new MyOperationResponse 
       { OutputHeader = new OutputHeader { Token = "someToken" } }; 
    } 
} 
Questions connexes