2016-04-29 10 views
5

Ich trat durch den Debugger in einigen Website-Datenbank-Code und beendete die Ausführung, bevor die Datenbank Änderungen angewendet wurden. Aber sie wurden noch in die Datenbank geschrieben!VERWENDUNG Block verhält sich anders in Website vs Windows-Formular

Ich habe versucht, das Problem mithilfe einer Windows Form-Anwendung neu zu erstellen, und es wurde nicht in die Datenbank geschrieben (erwartetes Verhalten). Ich ging zurück auf die Website, und es tat.

Hier ist eine einfache Beispielseite. Ich betreibe diese in einem Web-Website wenn es einen Unterschied macht:

<%@ Page Language="C#" %> 
<%@ Import Namespace="System.Diagnostics" %> 

<!DOCTYPE html> 

<script runat="server"> 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     using (MsSqlDataContextDataContext db = new MsSqlDataContextDataContext()) 
     { 
      Product product = db.Products.First(p => p.id == 21); 
      Debug.WriteLine("Line 1"); 
      // I learnt the hard way that if you try to update the database with the value 
      // that already exists, it seems to get optimised away. 
      // The update must a new value. 
      product.Type = "bogus" + DateTime.UtcNow.Ticks; 
      Debug.WriteLine("Line 2"); // <- Breakpoint here 
      db.SubmitChanges(); 
     } 
    } 
</script> 

<html> 
<head runat="server"> 
</head> 
</html> 

Ich beende die Ausführung (Umschalt + F5) am Haltepunkt, vor die zweite Debug-Druck oder SubmitChanges() ausgeführt werden sollen . "Zeile 2" ist nicht Ausgabe in das Debug-Fenster, aber die Datenbankänderungen sind gemacht.

Das Ausführen des gleichen Tests in einem Windows Form verhält sich gleich.

Stört der Seitenlebenszyklus oder das Sitzungsmanagement hier irgendwie? Wie ist das überhaupt möglich, Zeile 2 wird nicht gedruckt!

+0

Erhalten Sie eine Fehlermeldung/Ausnahme auf Windows-Formular, wie funktioniert es nicht? – raidensan

+0

@raidensan Ich werde es umschreiben. Es verhält sich nicht gleich. Es schreibt die Änderung nicht in die Datenbank (wie ich erwartet hatte, sollte es nicht, da ich vor dem 'Submit'-Aufruf abgebrochen wurde). – Ian

+0

"Werfen Sie neue Exception()" anstelle von "Debug.WriteLine (" Line 2 ")" in Ihrem Beispiel und sehen Sie, wie es geht. – Evk

Antwort

6

Wenn Sie das Debuggen in der Winform-App beenden, wird der Prozess beendet und der Code wird nicht mehr ausgeführt.

In asp.net ist dies nicht der Fall. Wenn Sie den Debugger (normalerweise) stoppen, wird der iis-Prozess nicht beendet, sondern nur der Debugger gelöst. Ihr Code wird weiter ausgeführt und die Anfrage wird abgeschlossen.

Es gibt Duplikate für diese Frage, keine Wiederholung, um dies als doppelt zu markieren.

+0

Gute Erklärung, ich habe gesucht, aber nicht wissen, die Ursache macht es schwierig. Ich werde sehen, ob ich einen Betrogenen finden und es selbst markieren kann :) Oder verlinke mich mit einem Betrogenen und ich werde es markieren. – Ian

+0

Kein genaues Duplikat: [link] (http://stackoverflow.com/questions/1338785/the-asp-net-code-still-executes-after-clicking-stopping-debugging-in-vs2008) (Erklärt, dass Sie brauchen um den Prozess zu beenden) – apr

Verwandte Themen