none
Object reference not set to an instance of an object, aber nur im Netz, lokal geht's RRS feed

  • Allgemeine Diskussion

  • Salü alle zusammen

    Ich habe folgenden Code:

    protected void Page_Load(object sender, EventArgs e) { LiteralControl lcAdressBlock = new LiteralControl(); try //Adress Block {

    // 1. Versuch: Geht nicht //lcAdressBlock.Text = Session["AdressBlock"].ToString();

    // 2. Versuch: Geht auch nicht
    //lcAdressBlock.Text = Context.Items["AdressBlock"].ToString();

    // 3.Versuch: Funktioniert lcAdressBlock.Text = "Lieferadresse ist unterdrückt"; phVorschau.Controls.Add(lcAdressBlock);

    Lokal in meinem VisualStudio funktioniert der 1. Versuch. Dann habe ich das Teil auf den Server beim Provider geladen und jetzt im Internet geht das nicht mehr. Es wird eine Exception geschmissen, Object reference not set to an instance of an object.

    Was muss ich machen um das Problem zu beheben?

    Viele liebe Grüsse

    • Typ geändert Stefan FalzModerator Montag, 8. Juli 2013 17:35 Keine Rückmeldung der Fragestellerin
    Dienstag, 28. Mai 2013 21:36

Alle Antworten

  • Hallo Sabrina,

    arbeitest Du lokal auch mit dem IIS? Oder mit dem ASP.NET Entwicklungswebserver? Wenn letzteres, würde ich dir empfehlen, lokal einen IIS zu installieren (wenn noch keiner vorhanden ist) und den dann auch für die Entwicklung zu verwenden. Es gibt einige wichtige Unterschiede zwischen den beiden Varianten.

    Steht der von dir gepostete Code in einer WebForm (aspx) bzw. einem WebControl (ascx)? Falls ja, könnte es bei Variante 1 sein, dass Sessions, bspw. über die web.config gar nicht aktiviert sind. Ich glaube aber eher, dass es gar keine Sessionvariable namens "AdressBlock" gibt. Daher kommt da null zurück und ToString schlägt verständlicherweise fehl. Dasselbe dürfte für Variante 2 gelten.

    Daher die Frage: Wo werden die Variablen in der Session bzw. in Context.Items gesetzt?


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Dienstag, 28. Mai 2013 21:42
    Moderator
  • Wow, guten Abend Stefan. Hey, das nenne ich Rekordzeit bei der Antwort. Vielen Dank.

    Ich verwende VisualStudio 2010 und das was da drinn steckt. Habe mit einem leeren Projekt begonnen und dann ein WebProjekt hinein gemacht.

    Ja der Code steht in der Bestaetigung.aspc.cs im Page_Load.

    Wenn ich F5 drücke, wird es im Browser angezeigt und dort funktioniert das ganze. Somit glaube ich persönlich, dass die Session Variable richtig geschrieben ist.

    Ich schreibe mit:

                        Session["AdressBlock"] = vAdressBlock;
                        Context.Items["AdressBlock"] = vAdressBlock;

    Und ich lese mit:

                    lcAdressBlock.Text = Session["AdressBlock"].ToString();
                    lcAdressBlock.Text = Context.Items["AdressBlock"].ToString();

    Habe in der web.config jetzt folgendes (sessionState...) eingebaut:

      <system.web>
        <compilation debug="true" targetFramework="4.0" />
        <sessionState cookieless="true" />

    Das ändert aber nichts.

    SR (Sabinchen ratlos)

    Wie soll ich vor gehen?

    Vielen lieben Dank und besten Gruss

    Dienstag, 28. Mai 2013 22:03
  • Hallo Sabrina,

    wo genau steht der Code mit den Zeilen:

    Session["AdressBlock"] = vAdressBlock;
    Context.Items["AdressBlock"] = vAdressBlock;

    und wo erstellst Du die Variable "vAddressBlock"?

    Kannst Du das testweise mal alles in dieselbe Seite und dort in die Page_Load Methode schreiben? Also in etwa so:

    protected void Page_Load(object sender, EventArgs e)
    {
        String vAdressBlock = "Hallo Welt";
    
        Session["AdressBlock"] = vAdressBlock;
        Context.Items["AdressBlock"] = vAdressBlock;
    
        LiteralControl lcAdressBlock = new LiteralControl();
        
        try //Adress Block
        {
            // 1. Versuch: Geht nicht
            //lcAdressBlock.Text = Session["AdressBlock"].ToString();
    
            // 2. Versuch: Geht auch nicht
            //lcAdressBlock.Text = Context.Items["AdressBlock"].ToString();
    
            // 3.Versuch: Funktioniert
            lcAdressBlock.Text = "Lieferadresse ist unterdrückt";
            phVorschau.Controls.Add(lcAdressBlock);
        }
        catch ...
        ...
    }
    

    Wenn das dann funktioniert, wären die Antworten auf die ersten beiden Fragen (oben in diesem Posting) wichtig. Denn dann gehe ich davon aus, dass der entsprechende Code auf dem Server nicht durchlaufen wird.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Dienstag, 28. Mai 2013 22:10
    Moderator
  • Hallo Sabrina,

    Ich verwende VisualStudio 2010 und das was da drinn steckt.

    wie gesagt, es gibt einige Unterschiede zwischen IIS und dem ASP.NET Entwicklungswebserver. Allen voran: IIS ist ein Dienst, der ASP.NET Entwicklungswebserver läuft als ganz normale Windowsanwendung. Alleine daraus ergeben sich viele Sachen, die mit IIS gar nicht funktionieren können, mit dem internen Webserver schon (MessageBox anzeigen, Anwendungen mit Oberfläche bzw. Benutzerinteraktion starten, ...).

    Ich würde daher lokal den IIS installieren und mit dem weiterarbeiten. Es erspart dir auf jeden Fall eine Menge Fragezeichen^^

      http://msdn.microsoft.com/de-de/library/58wxa9w5.aspx

      http://blogs.technet.com/b/bernhard_frank/archive/2011/02/17/iis-f-252-r-einsteiger-teil-1-installation.aspx

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Dienstag, 28. Mai 2013 22:15
    Moderator
  • Der Code

    Session["AdressBlock"] = vAdressBlock;
    Context.Items["AdressBlock"] = vAdressBlock;

    steht in der Datei StempelBestellung.aspx.cs in 

            protected void btnAbsenden_Click(object sender, EventArgs e)
            {

    Der Button ist innerhalb der <form id="form1" runat="server">

    Die Variable vAdressBlock wird unmittelbar vorher abgefüllt mit 

                        string vAdressBlock = string.Empty;
    
                        vAdressBlock += "<h2>Adressdaten</h2><table border=1>";
                        vAdressBlock += "<tr><td>Vor- und Nachname</td><td>" + tbVorname.Text + " " + tbNachname.Text + "</td></tr>";
                        vAdressBlock += "<tr><td>Adresse</td><td>" + tbAdresse.Text + "</td></tr>";
                        vAdressBlock += "<tr><td>PLZ Ort</td><td> " + tbPLZ.Text + " " + tbOrt.Text + "</td></tr>";
                        vAdressBlock += "<tr><td>E-Mail</td><td>" + tbEMail.Text + "</td></tr>";
                        vAdressBlock += "</table>";
                        Session["AdressBlock"] = vAdressBlock;
                        Context.Items["AdressBlock"] = vAdressBlock;

    Wie gesagt, lokal geht das, die Daten sind also vorhanden.

    Der code wird 100% durchlaufen. Denn nachfolgend kommt:

                        Session["AdressBlock"] = vAdressBlock;
                        Context.Items["AdressBlock"] = vAdressBlock;
                        cm.Text += vAdressBlock;
                        cm.Text += "</body></html>";
    
    
                    //Senden
                    ch.Aha.BaseLibs.cErrorObject eo = new ch.Aha.BaseLibs.cErrorObject();
                    eo = cm.MailSenden();
    


    Und mit der letzten Zeile wird ein Mail versendet. Das Mail kommt an und beinhaltet die Daten aus vAdressBlock

    Dein Beispiel habe ich folgendermassen umgesetzt:

            protected void Page_Load(object sender, EventArgs e)
            {
                LiteralControl lcAdressBlock = new LiteralControl();
                
                try //Adress Block
                {
                    //lcAdressBlock.Text = Session["AdressBlock"].ToString();
                    //lcAdressBlock.Text = Context.Items["AdressBlock"].ToString();  //Exception
                    lcAdressBlock.Text = "Lieferadresse ist unterdrückt";            //Funktioniert
                    phVorschau.Controls.Add(lcAdressBlock);
    
                }
                catch (Exception ex)
                {
    
                    //Context.Items["InnerException"] = ex.InnerException.ToString();
                    Context.Items["Message"] = ex.Message.ToString();
                    Context.Items["Fehlerquelle"] = "Bestätigung AdressBlock";
    
                    Server.Transfer("Fehlerseite.aspx");
                }
    

    Die Zeile //Exception wirft, wenn ich sie aktiviere, die exception, die Zeile //funktioniert, geht. Wobei ich natürlich nur jeweils die eine oder die andere aktiviere.

    Viele liebe Grüsse
    SR

    PS: gehe nun ins Bett, mir fallen die Augen zu. 

    Vielen lieben Dank für die Hilfe.

    Dienstag, 28. Mai 2013 22:24
  • Hallo Sabrina,

    wäre es machbar, die relevanten Codedateien mal als Datei zum Download zu stellen? Denn so aus dem Kontext gerissen weiß ich trotzdem nicht, was genau wo steht.

    Wenn das eine einzige Webform sein sollte und der Code steht komplett in dieser Datei, ist der Fehler klar. Button_Klick wird lange nach Page_Load ausgeführt. D.h. in Page_Load existieren die Session- und die Contextvariable noch nicht. Spät. beim zweiten Aufruf der Seite sollte das mit der Sessionvariablen aber gehen. Falls die Session beendet wurde (bspw. durch einen Anwendungsneustart, Anwendungspoolrecycling, Änderung der web.config, Speichern einer Datei im Anwendungsverzeichnis, ...) klappt es aber natürlich nicht mehr.

    ---

    Mein Beispiel hatte einen anderen Hintergrund. Der Code zum befüllen aller Variablen stand in derselben Seite, dort in Page_Load und vor allen Dingen, _vor_ dem Code, der die Variablen wieder ausliest. Mach das doch mal bitte, dann schauen wir weiter.

    Das ist deshalb wichtig, da es, sollte das dann auch nicht funktionieren, an was ganz anderem liegen könnte. Das ist nur nicht wirklich einfach zu erklären, daher probiere ich zuerst die üblichen Verdächtigen durch :)


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Dienstag, 28. Mai 2013 22:47
    Moderator