[C#] ArgumentException bij SOAP aanroep

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Intrepidity
  • Registratie: December 2003
  • Laatst online: 24-06-2024
Ik ben bezig met het maken van een toolbar voor Internet Explorer die door middel van SOAP wat gegevens ophaalt van een server. Een aantal aanroepen naar die webservice verlopen zonder problemen, maar er is er 1 die een ArgumentException blijft gooien met de onderstaande informatie:
System.ArgumentException: Item is al toegevoegd. Sleutel in woordenboek: System.Object Sleutel die wordt toegevoegd: System.Object
bij System.Collections.Hashtable.Insert(Object key, Object nvalue, Boolean add)
bij System.Collections.Hashtable.Add(Object key, Object value)
bij System.Collections.Hashtable.SyncHashtable.Add(Object key, Object value)
bij System.Web.Services.Protocols.SoapHttpClientProtocol.InvokeAsync(String methodName, Object[] parameters, SendOrPostCallback callback, Object userState)
Door middel van de 'wsdl' tool op de visual studio command line heb ik een proxyklasse laten genereren. Deze methode lijkt het beste voor mij te werken, aangezien ik een web service reference niet aan de praat krijg.

De onderstaande code lijkt de exception te triggeren:
C#:
1
2
3
4
5
6
7
8
9
10
        public void getLogin(Application application)
        {
            login_request request = new login_request();
            request.application_name = application.name;
            request.phpsessid = this.shared.sessid;

            // The line below raises the soap_getLoginCompleted()
            // eventhandler when the SOAP request is completed.
            soap.getLoginAsync(request);
        }

Zowel application.name als this.shared.sessid hebben geldige waarden.
Bij het aanroepen van getLoginAsync op de proxyklasse gaat het dus fout. Wat ik vreemd vind is dat de methoden in het .net framework de exception lijken te veroorzaken en dat de fout niet direct te herleiden is naar een bepaald stuk van mijn code of de proxyklasse. Ik zit al minstens een week op deze fout te hameren...
De SOAP webservice heb ik ook zelf gemaakt, maar aangezien de FireFox versie van de toolbar foutloos werkt, en ik geen SOAP fout naar m'n hoofd krijg heb ik aangenomen dat hier de fout niet zit.

Hoofdvraag: Wat kan deze fout veroorzaken, en waarom krijg ik geen informatie over waar de fout vandaan komt in mijn eigen code?
Bijvraag: Wat is het wezenlijke verschil tussen de wsdl commandline-tool en een web service reference? Is het verstandiger om deze laatste te gebruiken?
Alvast bedankt voor de hulp :)

Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 21-08 17:09
De exception (in het nederlands, gadver, zorg ajb dat je ze gewoon in het engels krijgt, want daarop googlen levert je niks op) zegt je gewoon letterlijk dat je twee keer dezelfde key aan een hashtable toevoegt. En dat mag niet.

https://niels.nu


Acties:
  • 0 Henk 'm!

  • Intrepidity
  • Registratie: December 2003
  • Laatst online: 24-06-2024
Hydra schreef op maandag 09 maart 2009 @ 10:18:
De exception (in het nederlands, gadver, zorg ajb dat je ze gewoon in het engels krijgt, want daarop googlen levert je niks op) zegt je gewoon letterlijk dat je twee keer dezelfde key aan een hashtable toevoegt. En dat mag niet.
Zover was ik ook nog wel met redeneren.. Maar ik gebruik nergens een hashtable, en ik gebruik nergens dubbele keys, dus wat ik niet snap is waar die exception vandaan komt.. Ook de proxyklasse gebruikt geen Hashtable, en deze lijkt door de .net klassen te worden aangemaakt, in code waar ik niet bij kan..

Acties:
  • 0 Henk 'm!

  • Intrepidity
  • Registratie: December 2003
  • Laatst online: 24-06-2024
Ter verduidelijking, de proxyklasse gebruikt de onderstaande code om de aanroep te doen:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
    public void getLoginAsync(login_request login_request) {
        this.getLoginAsync(login_request, null);
    }
    
    /// <remarks/>
    public void getLoginAsync(login_request login_request, object userState) {
        if ((this.getLoginOperationCompleted == null)) {
            this.getLoginOperationCompleted = new System.Threading.SendOrPostCallback(this.OngetLoginOperationCompleted);
        }
        this.InvokeAsync("getLogin", new object[] {
                    login_request}, this.getLoginOperationCompleted, userState);
    }

Mijn login_request object wordt dus doorgespeeld aan this.InvokeAsync. de proxyklasse extend vanaf System.Web.Services.Protocols.SoapHttpClientProtocol, en deze maakt dus blijkbaar een HashTable aan, en dit genereert de exception.

[ Voor 3% gewijzigd door Intrepidity op 09-03-2009 10:32 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Roep je toevallig 2 maal de methode aan? Of nogmaals een async methode voordat een andere klaar is.

In de SoapHttpClientProtocol.InvokeAsync word namenlijk hetvolgende gedaan
C#:
1
base.AsyncInvokes.Add(userState, result);

Je zou even kunnen testen om het volgende te doen.
C#:
1
soap.getLoginAsync(request, new object());

Je weet dan zeker dat je geen dubbele userState insert ( Defualt word, zoals je hierboven ook post, namenlijk null als userstate meegegeven. Als je dan 2 maal een methode aanroept, heb je een dubele key geinsert.
Intrepidity schreef op maandag 09 maart 2009 @ 10:02:
Hoofdvraag: Wat kan deze fout veroorzaken, en waarom krijg ik geen informatie over waar de fout vandaan komt in mijn eigen code?
Bijvraag: Wat is het wezenlijke verschil tussen de wsdl commandline-tool en een web service reference? Is het verstandiger om deze laatste te gebruiken?
Alvast bedankt voor de hulp :)
Op zich haalt dat niet zoveel uit. Als je een service reference toevoegt dan word die commandline tool intern ook gebruikt.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Intrepidity
  • Registratie: December 2003
  • Laatst online: 24-06-2024
Dat lijkt het probleem inderdaad op te lossen. Hieruit kan ik concluderen dat ten onrechte dezelfde methode 2 keer aangeroepen wordt, en het dus eigenlijk meer een workaround dan een fix is.. Dus ik ga nog even opzoek naar de oorzaak van de dubbele oproep :)
Bedankt voor de hulp tot zover d:)b

Overigens genereert de web service reference duidelijk andere code als de wsdl commandline tool, aangezien ik hierdoor een groot deel van mijn code omver moet gooien.. Misschien wordt er een andere versie gebruikt of iets dergelijks..

[ Voor 34% gewijzigd door Intrepidity op 09-03-2009 10:54 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Intrepidity schreef op maandag 09 maart 2009 @ 10:53:
Dat lijkt het probleem inderdaad op te lossen. Hieruit kan ik concluderen dat ten onrechte dezelfde methode 2 keer aangeroepen wordt, en het dus eigenlijk meer een workaround dan een fix is.. Dus ik ga nog even opzoek naar de oorzaak van de dubbele oproep :)
Bedankt voor de hulp tot zover d:)b
Het hoeft niet perse twee maal dezelfde methode te zijn die aangeroepen word, het zouden ook twee verschillende methodes kunnen zijn. Er is namenlijk één hashtable die voor alle methods op die proxy gebruikt word. Als je meerdere async calls tegelijk wilt doen moet je dus zorgen dat je verschillende state objecten meegeeft.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1