Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C#] SOAP namespace variabel

Pagina: 1
Acties:

  • Shinji
  • Registratie: Februari 2002
  • Laatst online: 13:10
Ik ben bezig met de AXL toolkit voor Cisco Unified Communications Manager maar ik loop tegen een probleem aan. Met WSDL heb ik de vanuit de schema's een AXLAPIService.cs weten te generen, nu zaten hier nog een paar fouten in maar na deze aangepast te hebben werkt alles zonder problemen. Het bestand is echter 330000 regels code en ik gebruik er maar een paar. Dus ik heb het één en ander er uit gestript waardoor ik alleen nog de methode's en classes heb die ik gebruik.

Nu zou in theorie deze API backwards compatible moeten zijn, echter als ik die voor versie 10 op een versie 9.1 installatie gebruik krijg ik een foutmelding. Nu verschillen de API's maar eigenlijk op twee puntjes en dat is de namespace en de SoapDocumentMethodAttribute.

C#:
1
2
3
4
5
6
7
8
9
10
11
public partial class AXLAPIService : System.Web.Services.Protocols.SoapHttpClientProtocol {   
    //wat dingen weg gelaten 
    [System.Web.Services.Protocols.SoapDocumentMethodAttribute("CUCM:DB ver=10.0 executeSQLQuery", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
    [return: System.Xml.Serialization.XmlElementAttribute("executeSQLQueryResponse", Namespace = "http://www.cisco.com/AXL/API/10.0")]
    public ExecuteSQLQueryRes executeSQLQuery([System.Xml.Serialization.XmlElementAttribute("executeSQLQuery", Namespace = "http://www.cisco.com/AXL/API/10.0")] ExecuteSQLQueryReq executeSQLQuery1)
    {
        object[] results = this.Invoke("executeSQLQuery", new object[] {
                    executeSQLQuery1});
        return ((ExecuteSQLQueryRes)(results[0]));
    }
}


Een vergelijkbaar iets komt op nog 2 plekken voor. Verander ik hier overal de versie 10.0 naar 9.1 dan werkt hij probleemloos.

Het lukt mij echter niet om deze waarde variabel te maken, een if gebruiken op deze plek gaat niet omdat het in de root van de class is.

Ik heb geprobeerd deze allen naar voren te halen om te kijken of hij dan nog werkt maar dat is niet het geval. Blijkbaar moeten ze direct voor de methode waarbij ze horen aangeroepen worden. Kon ik ze wel naar voren halen dan kon ik ze eventueel allemaal in één methode gooien en daar doorheen lopen met welke versie ik moet hebben.

Waarschijnlijk zit ik veel te moeilijk te denken en is er een betere oplossing voor maar ik kom er niet op. Ik hoop dat jullie me op de goede weg weten te helpen.

  • rikkert278
  • Registratie: Februari 2010
  • Laatst online: 13-06-2024
Het lukt mij echter niet om deze waarde variabel te maken, een if gebruiken op deze plek gaat niet omdat het in de root van de class is.
Je kunt preprocessorinstructies gebruiken (dat klinkt wat raar in het Nederlands, in het Engels is het preprocessor directives)
Preprocessor directives, such as #define and #ifdef, are typically used to make source programs easy to change and easy to compile in different execution environments. Directives in the source file tell the preprocessor to perform specific actions. For example, the preprocessor can replace tokens in the text, insert the contents of other files into the source file, or suppress compilation of part of the file by removing sections of text.
bron

Zo zou je ze kunnen gebruiken:


C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#define USE_ATTRIBUTES

imports Bla.Bla;

#if USE_ATTRIBUTES
[Attribute]
#else
[DifferentAttribute]
#endif
public class Whatever
{
    #if USE_ATTRIBUTES
    [AnotherAttribute]
    #endif
    public void Foo()
    {
        Console.Write("Foo called!");
    }

}


Hier kun je een lijst vinden van alle preprocessorinstructies en wat ze doen :)

[ Voor 4% gewijzigd door rikkert278 op 22-05-2014 04:38 . Reden: typo ]


  • Shinji
  • Registratie: Februari 2002
  • Laatst online: 13:10
Ziet er interessant uit, had het wel al ergens gezien maar wist niet echt wat het doel was. Ik ga er even mee stoeien of ik er iets zinnigs uit krijg. Het is wel redelijk basaal allemaal maar ik denk voldoende voor mijn doel :)

//edit
Even naar zitten kijken of ik hier iets mee kon bouwen, alleen wat ik merk is dat ik niet bijvoorbeeld aan de hand van een variabele die ik aan de constructor meegeef iets kan definen. Oftewel helemaal aan het begin moet worden bepaald welke versie het is maar ik wil het juist laten afhangen welke versie via een commandline parameter wordt meegegeven.

[ Voor 44% gewijzigd door Shinji op 23-05-2014 08:59 ]


  • [ti]
  • Registratie: Februari 2000
  • Niet online
Preprocessor directives zijn voor tijdens het compileren van je code: je geeft tijdens het compileren aan wat je target is. At runtime hebben ze dan dus geen invloed meer, ze hebben (in jouw geval) of code voor v9.1 gegenereerd of voor v10. In jouw geval zijn preprocessor directives dus niet de oplossing.


Je zou kunnen gaan kijken naar eigen implementaties van b.v. SoapDocumentMethodAttribute zodat je variabele namen in kunt stellen, maar ik zou er eigenlijk voor kiezen om een interface te maken van je webservice proxy, en twee implementaties te hanteren: een voor v9.1 en een voor v10. At runtime kies je dan welke je nodig hebt, en omdat ze via een interface zijn geimplementeerd is de aanroep hetzelfde. Mocht dan later blijken dat er stiekem meer verschil zit tussen v9.1 en v10 dan kom je daardoor niet in de problemen en pas je gewoon de implementatie van de specifieke versie aan.