Frage

Ich habe eine Web-Anwendung, die zur Zeit den aktuellen Httpcontext verwendet einen LINQ Datenkontext zu speichern. Der Kontext wird für die aktuelle Anforderung besteht, auf einer Basis pro Benutzer, pro Rick Strähls Blog :

string ocKey = "ocm_" + HttpContext.Current.GetHashCode().ToString("x")  
Thread.CurrentContext.ContextID.ToString();

if (!HttpContext.Current.Items.Contains(ocKey))
{
    // Get new Data Context and store it in the HTTP Context
}

Allerdings habe ich einige Skripte, die aus der Datei global.asax ausführen, dass hat nicht ein Httpcontext. Die HttpContext.Current NULL , da der Server derjenige ist, so dass die "Anfrage".

Gibt es ein Äquivalent-Objekt, das ich den Datenkontext speichern kann? Also muss ich es nicht darum kümmern, neu zu erstellen, und Anbringen / Abnehmen Objekte? Ich will nur den Kontext für die Lebensdauer meiner Prozesse bestehen bleiben.

AKTUALISIERT:

Ich versuche zur Zeit eine statische Variable in meiner DAL Hilfsklasse zu verwenden. auf den ersten Aufruf einer der Methoden in der Klasse der Datacontext instanziiert wird, und in der statischen Variablen gespeichert. Am Ende meines Verfahrens, nenne ich eine andere Methode, die Entsorgung auf der Datacontext-Anrufe und setzt die statische Variable auf NULL.

War es hilfreich?

Lösung

Können Sie nicht nur eine statische Variable verwenden speziell für diese Skripte? Das wird die gleiche Lebenszeit wie die AppDomain hat. Sie sollten wahrscheinlich sorgfältig über alle Gleichzeitigkeit Bedenken denken, aber es klingt wie der einfachste Weg, um einen Wert zu halten um.

(Ich habe gerade überprüft, und obwohl eine Instanz HttpApplication verwendet werden kann, mehrere Anforderungen zu bedienen, jeder dient nur eine Anforderung zu einer Zeit -., Die erstellt werden, legen nahe, dass mehrere Instanzen für die gleichzeitige Anforderungsverarbeitung habe ich nicht dies bestätigt, aber es klingt wie es nicht sicher wäre es in einer Instanzvariablen zu halten.)

EDIT: Joshs Antwort deutet darauf hin, dass Sie dies pro Thread sein wollen. Das klingt mir etwas seltsam, wie wenn Sie einen haben Los diese Ereignisse auftreten, sind Sie sehr wahrscheinlich, immer nur sehen, wie sie auf verschiedene Threads ausführen, wodurch das gesamte Sharing Geschäft sinnlos. Wenn Sie wirklich so etwas wollen tun, würde ich vorschlagen, nur eine Instanz-Variable in der HttpApplication abgeleitete Klasse mit - aus genau dem Grunde im Absatz oben beschrieben:)

Andere Tipps

Warum nicht den aktuellen Httpcontext verwenden? Die Skripte in Ihrer global.asax-Datei ist alle das Ergebnis einer Anfrage in den Server kommen, so sollte es ein Zusammenhang mit diesem Antrag in Verbindung gebracht werden, die Sie ergreifen können.

Ich verstehe nicht die Notwendigkeit, den Schlüssel auf dem Hash-Code oder den Thread basierend zu erzeugen. Es wird eine separate Instanz von Httpcontext für jede Anforderung sein, die hereinkommt, und dass beispielsweise wird auf den Faden um genau zu sein, der die Anforderung verarbeitet. Aus diesem Grund ist der Schlüssel ziemlich wertlos, wenn es auf die Instanz von Httpcontext und dem Thread basiert.

Auch, wie entsorgt man die Datacontext, wenn Sie fertig sind? Es implementiert IDisposable für einen Grund, also würde ich gegen eine freigegebene Instanz wie dies empfehlen.


UPDATE

In den Kommentaren zeigt an, dass es einen Timer, der das ausgeführt wird, um die Ausführung von Skripten. Anstelle des Timers, würde ich empfehlen, eine geplante Task einrichten, die einen Webservice oder vorgegebenen Seite auf der Website aufruft, die die Aufgabe durchführen wird. Dann werden Sie immer ein Httpcontext haben mit zu arbeiten.

HttpContext.Current ist eine statische Methode und sollte von jedem Ort so lange zur Verfügung, wie der Code im Kontext einer Anfrage ausgeführt wird.

In Ihrem Fall Ihre nicht im Rahmen einer Anfrage ausgeführt wird, könnten Sie schauen auf Application.Cache verwenden, aber ich warne gegen eine Datacontext offen zu halten. Ich bin nicht sehr famillar mit Linq zu Entitäten, also könnte ich falsch sein, aber die Caching Datenbank bezogene Elemente wie die Verbindungen der Regel ist schlecht.

Ich würde auch empfehlen, dass Sie die Logik aus Ihrem global.asax in Erwägung ziehen und auf einen Windows-Dienst. Dies würde Sie mehr Kontrolle über diese Aufgaben haben, zum Beispiel können Sie sie nach unten über Einzel der Website schließen kann.

Bearbeiten

Wie JS weist darauf hin, eine statische Variable verwenden könnte. Sie könnten auch eine Instanzvariable markiert mit Thread Attribute definieren. Dadurch wird jeder Faden seine eigene Kopie der Variablen geben und Conten beseitigen. Da Sie jeden Thread wollen sowieso seine eigene Kopie haben.

Gibt es einen Grund, warum diese Notwendigkeit, die gleiche Art und Weise wie die anderen Datacontexts behandelt werden? Es scheint mir, dass, wenn der Kontext nur innerhalb der Ereignisbehandlungsroutine erforderlich ist, sollten Sie es nicht um halten müssen. Vor allem, wenn es in Application_Start (wie pro Ihrem Kommentar) ist, würde ich nicht die Mühe, es überall die Caching -. Es nur lokal verwenden und es zu den anderen Methoden übergeben nach Bedarf

Stellen Sie den Datacontext als Zustandsparameter, wenn Sie den Timer zu schaffen. Basierend auf den Informationen, die Sie auf den Kommentaren gepostet, so scheint es mir, dass Ihr Datacontext an die Timer als alles anderes in Beziehung steht.

Vermeiden Sie auch die gleiche Datacontext für verschiedene Timer zu verwenden, da Sie mit gemischten Änderungen aus den verschiedenen Zeiten enden würden. Auch stellen Sie sicher, dass gleiche Timer-Logik ist nicht zweimal ausgeführt, da es das gleiche heißt auch kurze Zeit ohne Kontrolle führen würde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top