Wie rufe ich die Httpcontext Eigenschaften, wenn es null zurückgibt?
-
22-08-2019 - |
Frage
Ich mache einige asynchrone Arbeit auf einem separaten Thread mit:
ThreadPool.QueueUserWorkItem()
und in diesem separaten Thread, ich brauche HttpContext.Current
zu nennen, damit ich zugreifen kann:
HttpContext.Current.Cache
HttpContext.Current.Server
HttpContext.Current.Request
Allerdings HttpContext.Current
ist null, wenn ich diesen separaten Thread erstellen.
Frage
Wie kann ich einen neuen Thread erstellen, so dass HttpContext.Current
nicht null ist? Oder gibt es eine andere Art und Weise ich den Cache, Server zugreifen kann, und Request-Objekte?
Lösung
Ich würde nicht versuchen, einen Verweis auf ein Objekt zu halten, die wie die Httpcontext auf dem ASP.NET-Stack abhängt. Wenn Sie eine Arbeit in einem anderen Thread tun müssen, ist es, weil Sie in der ASP.NET warten möchten eine nicht bis Ihre Aufgabe beendet ist. Und vielleicht die Anfrage / Kontext / Session beendet wird, während der Thread nicht.
Sie sollten ein Objekt mit den Daten, die für Ihren Thread übergeben.
Andere Tipps
Sie können die ASP.NET-Cache zugreifen mit HttpRuntime.Cache , auch wenn Sie nicht über ein Httpcontext, aber leider kann man nicht Server oder Anfragen zuzugreifen.
Wenn man darüber nachdenkt, das Sinn -. Sie dienen keine Seite, so dass Sie keinen Antrag haben
1- unten Code hinzufügen in <system.serviceModel>
in Web.config-Datei:
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
2- Fügen Sie unten Code nach Namespace in Web-Service-Datei:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
3- Webpart Projekt neu. Fertig!
Für HttpContext.Server Dienste können Sie HttpServerUtility Klasse. Für den Cache können Sie HttpRuntime.Cache verwenden, wie es oben gesagt wurde. Für das Request-Objekt können Sie die Daten aus der Anfrage an den Thread übergeben, wenn sie erstellt wird. Dinge wie Request.QueryString oder Request.Form ... oder was auch immer.
Es gibt eine Thread-Pool Implementierung hier , dass die Ausbreitung des HTTP rufenden Thread Kontext liefert . Ich habe es noch nicht benutzt, aber ich plane zu.
Wenn der separate Thread versucht, auf diese Objekte zuzugreifen, dann ja sie null sein. Diese Aufgaben werden auf Thread-Ebene scoped. Wenn Sie sie in einem neuen Thread verwenden möchten, müssen Sie sie in die Methode / Klasse übergeben müssen, wo sie gebraucht werden.
Normalerweise ASP.Net erlaubt Ihnen nicht, neue Threads zu erstellen, ... Hier ist ein Threading in ASP.NET von MSDN .