Domanda

Qual è il modo più semplice per clonare della richiesta corrente HttpContext esempio?

Sto sviluppando un'applicazione in Asp.net MVC v1 . Ho aggiornato le funzionalità PartialView regolari di avere in realtà sub-controller che agiscono in modo molto simile, ma hanno il loro proprio contesto. Quando si utilizza PartialViews è necessario compilare i dati di visualizzazione per la vista parziale in azione il controllore di visualizzazione principale. Ho creato il mio funzionalità che consente di chiamare azioni di controllo all'interno di una vista. In questo modo ottengo:

  • Non c'è bisogno di fornire i dati del sub-vista in azione di controllo del mio punto di vista principale
  • sub metodi controllore può manipolare i dati più incapsulati senza alcuna relazione con altre viste / controllori

Il problema è che ogni richiesta sub-controllore utilizza HttpContext. Così, quando ho impostato alcuni HttpContext.Item in un sub-controller si popola in realtà HttpContext della richiesta effettiva.

È per questo che voglio clonare HttpContext. Sto già utilizzando:

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

, ma questo non imposta altro che richiesta e risposta. Ma probabilmente anche bisogno di altre proprietà e collezioni ... Come Session, Elementi, per l'utente ... etc.

È stato utile?

Soluzione 2

Non è possibile

Credo che un vero e proprio clonazione profondo non è possibile a causa della stato della sessione server. La clonazione avrebbe anche di clonare questo valore, che è il server Web specifica risorsa interna che è intrinsecamente statica e non può essere clonato. In questo caso, un web server avrebbe più oggetti di sessione, per esempio.

Soluzione
Comunque. La soluzione era per impostare valori contesto supplementari prima istanziare elaborazione sub-controller. Dopo l'elaborazione è finito sono ritornato di nuovo a valori originali. Così ho dovuto contesto come era prima.

Altri suggerimenti

Mentre il "non è possibile" risposta è corretta, c'è un'alternativa che è molto più pulito che scrivere i valori nel contesto attuale e poi riscrivere di nuovo al suo stato originale. La soluzione è quella di fare un nuovo oggetto HttpContext del tutto che si basa sulla URL di tua scelta.

// 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...
} 

Riferimento: https://github.com/maartenba/MvcSiteMapProvider/issues/ 278 # issuecomment-34905271

Il framework ASP.NET MVC rende intenzionalmente le dipendenze per le classi astratte con tutti i membri virtuali. Che dice semplicemente -. Estensibilità

Controllers dipendono HttpContextBase, non HttpContext. Forse si può rendere il vostro sub-controller dipendono HttpContextBase troppo in modo da poter avvolgere. Solo i miei 2 centesimi.

Ho usato

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

di grande effetto, che mi permette di creare completamente isolate azioni / escapsulated senza ricorrere a codice complesso. Ciò sembrerebbe offrire la stessa funzionalità senza la stessa complessità.

Le viste resi sono viste parziali standard e le azioni di controllo come qualsiasi altro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top