2009-07-10 5 views
1

J'essaye de tester le code autour d'un service web qui n'est pas encore disponible. J'essaye de simuler ma propre version. Selon les spécifications, il sera appelé comme ça.Puis-je créer un service Web doté de propriétés?

var service = new Service(); 
service.SD = new ServiceData(); 
service.SD.ID = "ABC123"; 
service.SD.Auth = "00000"; 
string result = service.DoMyThing(); 

Ceci est le plus proche que j'ai eu.

var service = new Service(); 
service.set_SD(new ServiceData()); 
service.get_SD().ID = "ABC123"; 
service.get_SD().Auth = "00000"; 
service.DoMyThing(); 

Le problème est avec la propriété SD. Comment écrire le service pour que Visual Studio 2008 génère correctement la référence Web?

Voici mon code de service web factice actuel.

public class Service : System.Web.Services.WebService 
{ 
    // This doesn't show up in the generated proxy at all 
    public static ServiceData SDTest; 

    // For extra credit explain why this needs to be static for it to work 
    private static ServiceData _sd; 
    public ServiceData SD 
    { 
     [WebMethod(EnableSession = true)] 
     get { return _sd; } 
     [WebMethod(EnableSession = true)] 
     set { _sd = value; } 
    } 

    [WebMethod] 
    public string DoMyThing() 
    { 
     // Presumably the real service accesses SD in here 
     return ""; 
    } 
} 

public class ServiceData 
{ 
    public string ID { get; set; } 
    public string Auth { get; set; } 
} 

Répondre

1

Je suis avec casperOne à ce sujet. Je pense que l'utilisation des propriétés fakie est plus ennuyante qu'utile. Pourtant, si vous êtes marié à cela, il suffit d'éliminer le getter pour la propriété. Vous n'en avez pas besoin. Pour ce faire, à la place:

var service = new Service(); 
ServiceData sd = new ServiceData(); 
sd.ID = "ABC123"; 
sd.Auth = "00000"; 
service.SD = sd; 
string result = service.DoMyThing(); 

Si Visual Studio nomme encore la propriété setter vous pouvez utiliser incorrectement l'un des attributs du savon pour le renommer.

EDIT: Vous devrez également définir SD comme en-tête SOAP.

+0

Cela ne fonctionne pas. Il ne peut pas y avoir de propriété SD. Passez "sd" comme paramètre de méthode. –

+0

Non, je suis assez sûr que cela fonctionne dans .Net. Il est envoyé en tant que en-tête SOAP personnalisé. Voir: http://www.codeproject.com/KB/webservices/SOAPHeaderAuthentication.aspx –

+0

Cela fonctionne uniquement s'il existe un en-tête SOAP personnalisé. Il doit être déclaré par le WSDL. –

3

Votre conception est erronée. Les services Web ne sont pas destinés à avoir des propriétés. Ils ne devraient exposer les méthodes, la raison étant que le protocole HTTP est sans état (et les services Web le supposent aussi), exposer une propriété n'a de sens que si vous voulez qu'elle s'applique à tous les appelants de l'instance (et même, dans cette situation, cela n'a aucun sens de l'exposer). Au contraire, ce que vous voulez faire est de faire que la méthode DoMyThing prenne l'instance de ServiceData (si nécessaire) et opère dessus, en retournant le jeu de résultats approprié.

Si vous avez vraiment besoin d'exposer les propriétés du service, vous avez une méthode GetProperties (ou quelque chose comme ça) qui ne prend aucun paramètre et renvoie la structure de données appropriée avec les informations de service.

1

Vous ne pouvez pas faire cela, n'essayez donc pas de "simuler". Le mieux que vous pouvez faire est:

var service = new Service(); 
ServiceData sd = new ServiceData(); 
sd.ID = "ABC123"; 
sd.Auth = "00000"; 
string result = service.DoMyThing(sd); 
0

Pour ceux qui pourraient être intéressés. Cela reflète plus précisément les spécifications que ma version aseptisée ci-dessus (je ne savais pas "TypeNameValue" était un indice clé, désolé!).

var service = new Service(); 
service.ServiceDetailsValue = new ServiceDetails(); 
service.ServiceDetailsValue.ID = "ABC123"; 
service.ServiceDetailsValue.Auth = "00000"; 
string result = service.DoMyThing(); 

Et c'est le code de service Web fictif qui fonctionne.

using System.Web; 
using System.Web.Services; 
using System.Web.Services.Protocols; 

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(Name="TestService", ConformsTo = WsiProfiles.BasicProfile1_1)] 
public class Service : System.Web.Services.WebService 
{ 
    public ServiceDetails SDTest; 

    [WebMethod] 
    [SoapDocumentMethod(Binding = "TestService")] 
    [SoapHeader("SDTest", Required = true)] 
    public string DoMyThing() 
    { 
     return ""; 
    } 
} 

public class ServiceDetails : System.Web.Services.Protocols.SoapHeader 
{ 
    public string ID { get; set; } 
    public string Auth { get; set; } 
} 
+0

Notez que le service n'a pas de propriétés.Une instance d'une autre classe (ServiceDetails) a été allouée par la classe proxy et est remplie avant l'appel de service Web. Lorsque l'appel est effectué, cette instance est sérialisée en tant que

du message SOAP. Le service pourra le lire comme un domaine public. –

Questions connexes