2016-08-22 1 views
0

Tout d'abord, je veux partager mon scénario ce que je veux construire -
Scénario: Je construis une application cliente en utilisant wpf. Dans certains cas, je dois appeler un service Web pour obtenir des données du serveur. Pour ce faire, j'ai ajouté une référence Web en utilisant wsld url. Et j'ai créé une classe ServiceManager qui appellera la méthode de service. Pour des raisons de sécurité, j'ai besoin d'ajouter quelques informations d'en-tête au soap xml request par exemple, UserToken, SAML Token et ainsi de suite. Je peux cela à partir de ma classe ServiceManager. Mais je veux ajouter une autre classe qui sera appelée avant d'envoyer une requête au serveur. Dans cette classe, je vais faire quelque chose comme l'ajout d'en-tête de sécurité à savon xml demande avec demande, puis l'envoyer au serveur. J'ai utilisé l'extension SOAP pour remplir mon objectif et cela fonctionne bien. Mais le problème est, chaque fois que j'ai besoin d'ajouter des annotations dans le fichier Reference.cs (pour chaque référence de service Web) en haut de la méthode de service. Je crois qu'il y a un autre moyen plus facile de faire fonctionner cela mieux que l'extension SOAP. Y a-t-il un moyen quelconque où je peux seulement appeler le service et une classe déléguée sera appelée automatiquement et je n'ai pas besoin d'ajouter d'annotation au fichier de référence? Je vais partager mon code d'échantillon ici.comment ajouter une classe de délégué pour la classe de gestionnaire de service lors de l'appel du service de savon dans C#?

classe ServiceManage:

public class ServiceManager 
{ 
public UserDataService dataService; //web service added at Web Reference 
public ServiceManager() 
{ 
dataService = new UserDataService(); 
getUserServiceRequest rqst = new getUserServiceRequest(); 
getUserServiceResponse resp = dataService.getUser(rqst); 
} 
} 

Reference.cs

[TraceExtensionAttribute(Name = "First")] 
public getUserServiceResponse getUser([System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] getUserServiceRequest request) { 
object[] results = this.Invoke("getUser", new object[] { 
        request}); 
return ((getUserServiceResponse)(results[0])); 
} 

TraceExtensionAttribute.cs

[AttributeUsage(AttributeTargets.Method)] 
public class TraceExtensionAttribute : SoapExtensionAttribute 
{ 
    private string mstrName = null; 
    public override Type ExtensionType 
    { 
     get { return typeof(TraceExtension); } 
    } 
    public override int Priority 
    { 
     get { return 1; } 
     set { } 
    } 
    public string Name 
    { 
     get { return mstrName; } 
     set { mstrName = value; } 
     } 
} 

TraceExtension.cs

public class TraceExtension : SoapExtension 
{ 
    public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attr){//..do something} 
    public override void Initialize(object initializer){//..do something} 
    public override Stream ChainStream(Stream stream){//...do something} 
    public override void ProcessMessage(SoapMessage message) {//..do something} 
} 

Répondre

0

Enfin, je trouve la solution. Juste à travers Web Reference et ajouter référence de service à la place. Ensuite, passez au the following link. Ça marche pour moi.