Domanda

Questa sarebbe una domanda per chiunque abbia codice nella cartella App_Code e utilizzi un bilanciatore del carico hardware.È vero che il bilanciatore del carico hardware potrebbe essere impostato su sessioni permanenti per risolvere il problema, ma in un mondo perfetto vorrei che la funzionalità fosse disattivata.

Quando un file nella cartella App_Code e il sito non è precompilato, iis genererà nomi di file casuali per questi file.

server1 "/ajax/SomeControl, App_Code.tjazq3hb.ashx"
server2 "/ajax/SomeControl, App_Code.wzp3akyu.ashx"

Pertanto, quando un utente pubblica la pagina e viene trasferito sull'altro server, non funziona nulla.

Qualcuno ha una soluzione per questo?Potrei passare a un sito Web precompilato, ma perderemmo la capacità del nostro reparto QA di promuovere semplicemente i file modificati.

È stato utile?

Soluzione

Potresti spostare tutto ciò che è presente nel tuo app_code in una libreria di classi esterna se il tuo reparto QA può promuovere l'intera libreria.Penso che sei bloccato con sessioni persistenti se non riesci a trovare un modo conveniente o tollerabile per passare a un sito precompilato.

Altri suggerimenti

Il nodo <machinekey> su entrambi i server è impostato sullo stesso valore?

È possibile sovrascrivere il file machine.config in web.config per impostarlo.Questo deve corrispondere altrimenti puoi ottenere situazioni strane come questa.

Il tuo sistema di bilanciamento del carico supporta sessioni permanenti?Con questa opzione attivata, il bilanciatore instraderà lo stesso IP allo stesso server più e più volte entro un determinato intervallo di tempo.In questo modo, tutte le richieste (AJAX o altro) da un client colpirebbero sempre lo stesso server nel cluster/farm.

Ok, per prima cosa...la cosa di MachineKey è vera.Dovrebbe essere assolutamente impostato allo stesso modo su tutte le macchine con bilanciamento del carico.Non ricordo tutto ciò che influisce, ma fallo comunque.

In secondo luogo, vai avanti e precompila il sito.In realtà puoi ancora distribuire nuove versioni, ogni volta che è presente un file .cs per una pagina, quella pagina viene ricompilata.Ciò che diventa complicato sono i file app_code che vengono compilati in una singola DLL.Tuttavia, se viene apportata una modifica, puoi caricare la nuova DLL e di nuovo tutto dovrebbe andare bene.

Per rendere le cose ancora più semplici, abilita l'opzione "Utilizzi nomi fissi e gruppi di pagine singole".Ciò garantirà che le cose abbiano lo stesso nome in ogni compilazione, quindi basta testare e quindi sostituire i file .dll modificati.

Detto questo, non dovresti avere problemi così come sono.La richiesta va a IIS, che si limita a fornire la pagina e a compilarla secondo necessità.Se il codice sottostante è diverso su ciascuna macchina, non dovrebbe avere importanza, il codice è lo stesso e quella macchina farà riferimento al proprio codice.La richiesta/postback effettiva non ne sa né si preoccupa.Tutto quello che ho detto sopra dovrebbe aiutare a semplificare le cose, ma dovrebbe funzionare comunque...quindi probabilmente è un problema del machinekey.

Se si tratta di un bilanciatore del carico hardware, non dovresti avere problemi, perché tutto ciò che è noto è l'URL della richiesta, in cui il server compilerà la pagina richiesta e la servirà.

l'unico problema che mi viene in mente che potresti avere è con la sessione e lo stato di visualizzazione.

È vero che il bilanciatore del carico hardware potrebbe essere impostato su sessioni permanenti per risolvere il problema, ma in un mondo perfetto vorrei che la funzionalità fosse disattivata.

Sembra che sia solo per la crittografia ViewState.Non influisce sui nomi dei file per gli assembly compilati automaticamente.

Penso che il modello asp.net abbia una certa dipendenza per la crittografia e l'archiviazione specifica della macchina, quindi non sono sicuro che funzioni per evitare IP persistenti per la sessione.

Non conosco ASP.NET AJAX (utilizzo invece l'approccio MonoRail NJS), ma lo stato della sessione potrebbe essere un problema per te.

Devi assicurarti che gli stati della sessione siano serializzabili e non utilizzino la sessione InMemory.Probabilmente è necessario eseguire ASP.NET Session State Server per assicurarsi che l'intera farm frontend utilizzi lo stesso spazio di archiviazione della sessione.In tal caso la sessione deve essere perfettamente serializzabile (ecco perché non è preferibile alcun oggetto nella sessione, devi sempre utilizzare l'ID e scommetto che MS si attiene a questa limitazione quando sviluppano la libreria AJAX)

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