Frage

Was ist der einfachste Weg, aktuelle Anforderung der Httpcontext-Instanz zu klonen?

Ich entwickle eine app in Asp.net MVC v1 . Ich habe ein Upgrade die regelmäßigen PartialView Fähigkeiten tatsächlich Substeuergerate haben, die sehr ähnlich wirken, sondern haben ihren eigenen Kontext. Wenn Sie PartialViews verwenden müssen Sie Ansichtsdaten für die Teilansicht in der Hauptansicht der Controller-Aktion füllen. Ich habe meine eigene Funktionalität, die es möglich macht, Controller-Aktionen aufrufen aus einer Ansicht. Auf diese Weise erhalte ich:

  • Ich muß Unter Ansicht der Daten in meiner Hauptansicht der Controller-Aktion nicht bieten
  • Sub-Controller Methoden können Daten mehr Encapsulated ohne Bezug zu anderen Ansichten / Controller
  • manipulieren

Das Problem ist, dass jede Sub-Controller Anforderung verwendet Httpcontext. Also, wenn ich einige HttpContext.Item in einem Sub-Controller setzen es auffüllt tatsächlich Httpcontext der aktuellen Anfrage.

Deshalb habe ich Httpcontext klonen möchten. Ich bin schon mit:

HttpContext subContext = new HttpContext(request, response);
// what happened to Session, User, Items etc. properties?

, aber dies wird nicht gesetzt etwas anderes als Anfrage und Antwort. Aber ich würde wahrscheinlich müssen auch andere Eigenschaften und Sammlungen ... wie die Session, Artikel, Benutzer ... etc.

War es hilfreich?

Lösung 2

Nicht möglich

Ich denke, eine tatsächliche tief Klonen, weil der Server-Sitzungsstatus nicht möglich ist. Cloning müßte auch diesen Wert klonen, die Web-Server-spezifische interne Ressource, die in sie statisch ist und nicht geklont werden kann. In diesem Fall wäre ein Web-Server mehrere Sitzungsobjekte zum Beispiel hat.

Behelfslösung
Sowieso. Die Abhilfe war zusätzliche Kontextwerte zu setzen, bevor Substeuergerät Verarbeitung Instanziierung. Nach der Bearbeitung beendet ist zurückgekehrt I-Werte wieder auf Original. Also ich Kontext tatsächlich hatte, wie es vorher war.

Andere Tipps

Während die „Nicht möglich“ Antwort richtig ist, gibt es eine Alternative, die viel sauberer ist, als Wert in den aktuellen Kontext zu schreiben und dann wieder in seinen ursprünglichen Zustand neu zu schreiben. Die Lösung ist ein neues Httpcontext-Objekt vollständig zu machen, die auf der URL Ihrer Wahl basiert.

// A new request/response is constructed to using a new URL.
// The new response is using a StreamWriter with null stream as a backing stream 
// which doesn't consume resources

using (var nullWriter = new StreamWriter(Stream.Null))
{
    var newRequestUri = new Uri("http://www.somewhere.com/some-resource/");
    var newRequest = new HttpRequest("", newRequestUri.ToString(), newRequestUri.Query);

    var newResponse = new HttpResponse(nullWriter);
    var newContext = new HttpContextWrapper(new HttpContext(newRequest, newResponse));

    // Work with the new context here before it is disposed...
} 

Referenz: https://github.com/maartenba/MvcSiteMapProvider/issues/ 278 # issuecomment-34.905.271

Der ASP.NET MVC-Framework absichtlich macht Abhängigkeiten zu abstrakten Klassen mit allen Mitgliedern virtuell. Das sagt einfach -. Dehnbarkeit

Controller hängt von Httpcontextbase, nicht Httpcontext. Vielleicht können Sie Ihre Substeuergerate hängen von Httpcontextbase machen, damit Sie es wickeln können. Just my 2 cents.

Ich habe verwendet

<% Html.RenderAction("Action", "Controller"); %>

, um große Wirkung, so dass mir völlig isoliert / escapsulated Aktionen erstellen, ohne zu komplexem Code zurückzugreifen. Dies scheint die gleiche Funktionalität ohne die gleiche Komplexität anbieten zu können.

Die gerenderten Ansichten sind Standard-Teilansichten und die Controller-Aktionen wie jedes andere.

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