System.NullReferenceException - Object reference not set to an instance of an object



  • Diesen Fehler erhalte ich beim Versuch ein Programm zu debuggen, leider finde ich dessen Ursache nicht.Des weiteren findet VS das Programm syntaktisch in Ordnung, jedenfalls meldet es keine Syntaxfehler oder Warnungen: erst beim eigentlichen "Probedurchlauf" wird diese Exception gemeldet.

    Die Codepassage ist recht simpel. Es soll eine SOAP Message mit einem DIME Attachment an einen Server gesendet werden:
    (Dabei verwende ich die Web Service Enhancements (WSE) von Microsoft und .NET)

    //(...)
    SoapContext *reqC = RequestSoapContext::Current; 
    DimeAttachment *dimeAttach = new DimeAttachment(
    			"image/gif", TypeFormat::MediaType,
                            "C:\\temp\\IMG_3621.jpg");
    reqC->Attachments->Add(dimeAttach); //Diese Zeile wirft Exception!
    //(...)
    

    Ein dieser Methode ähnliches Beispiel findet sich dort: http://www.codeproject.com/soap/DimeTest.asp
    Nur muss die Kommunkiation in meinem Programm anders herum laufen (Im Beispiel wird eine Nachricht mit DIME Att. vom Server angefragt, bei mir soll eine solche an den Server gesendet werden).
    Hat irgendwer eine Idee?



  • Sollte das nicht:

    SoapContext *reqC = RequestSoapContext::Current();
    

    bzw.:

    SoapContext *reqC = RequestSoapContext::get_Current();
    

    heissen?



  • Wird akzeptiert, leider dennoch bei gleichem Resultat. ich vermute aber auch, das in dem SoapContext der Hund begraben ist. Irgendwie scheint der keinen Wert zu erhalten und reqC zeigt ins Leere.



  • So ganz trivial war der Fehler dann doch nicht.

    Den SoapContext muss man, je nach dem ob es sich um einen Server (in der MSDN Web Service genannt) oder ob es sich um einen Client handelt, anders setzen.

    Zur Kommunikation mit einem Web Service von einem Client aus, muss man einen Proxy erzeugen um dem Client die "Service Methoden" offenzulegen. Das kann man über WSDL verarbeitende Tools erledigen, wird einem Falle der Verwendung von VS.NET aber insofern erleichtert, als dass man eine "Web Referenz" auf einen (vorhandenen) Service setzen oder updaten kann.
    Dieser Proxy wird aber per default abgeleitet von System::Web::Services::Protocols::SoapHttpClientProtocol. Will man aber nun die WSE verwenden muss man dies händisch ändern und zwar in Microsoft::Web::Services2::WebServicesClientProtocol.
    Nun muss man eine Instanz der Proxy Klasse erezugen, z.B.

    Server003::Server003Class *proxServer = new Server003::Server003Class();
    

    und kann darauf den SoapContext für den CLient setzen, allerdings ohne verwendung von "Current" (das darf man nur beim Server/ Web Service benutzen):

    //SoapContext setzen
    SoapContext *reqC = pCServer->RequestSoapContext;
    

    Und weg isse, die

    System.NullReferenceException

    , weil im SoapContext plötlich etwas steht. :xmas2:


Anmelden zum Antworten