È stata rilevata un'impostazione ASP.NET che non si applica in modalità pipeline gestita integrata


401

Ho installato DotNetOpenAuth SDK-3.4.5.10201.vsix e non riesco a farlo funzionare. Funziona localmente (quando corro come localhost) ma quando provo a pubblicarlo non funziona.

Il messaggio di errore IIS che ricevo è

Riepilogo errori Errore
HTTP 500.22 - Errore interno del server
È stata rilevata un'impostazione ASP.NET che non si applica in modalità pipeline gestita integrata.

E

Module       ConfigurationValidationModule  
Notification BeginRequest  
Handler      StaticFile  
Error Code   0x80070032  

quindi ci sono alcuni suggerimenti su come risolvere il problema:

Cose che puoi provare:

  • Migrare la configurazione nella system.webServer/modulessezione. Puoi farlo manualmente o usando AppCmd ​​dalla riga di comando, ad esempio %SystemRoot%\system32\inetsrv\appcmd migrate config "Default Web Site/". L'uso AppCmdper migrare l'applicazione consentirà il funzionamento in modalità integrata e continuerà a funzionare in modalità classica e nelle versioni precedenti di IIS.

  • Se si è certi che sia corretto ignorare questo errore, è possibile disabilitarlo impostando system.webServer/validation@validateIntegratedModeConfiguration su false.

  • In alternativa, passare l'applicazione a un pool di applicazioni in modalità classica, ad esempio %SystemRoot%\system32\inetsrv\appcmd set app "Default Web Site/" /applicationPool:"Classic .NET AppPool". Fallo solo se non riesci a migrare la tua applicazione.
    (Impostare "Sito Web predefinito" e "AppPool .NET classico" sul percorso dell'applicazione e sul nome del pool di applicazioni)

Ma il problema è che non ho accesso al server ISS in quanto non ne sono il proprietario. C'è un modo per risolverlo?

Risposte:


782

La seconda opzione è quella che desideri.

Nel tuo web.config, assicurati che queste chiavi esistano:

<configuration>
    <system.webServer>
        <validation validateIntegratedModeConfiguration="false"/>
    </system.webServer>
</configuration>

10
Questo non dovrebbe davvero influire sulla sicurezza della tua app. Disattiva semplicemente l'avviso che dice che hai alcuni valori di configurazione che non verranno utilizzati.
David

19
Questo non è un consiglio davvero eccessivo se hai impostazioni che non verranno utilizzate, dovresti rimuoverle.
Seph

33
@Seph, non sono d'accordo che questo non sia un buon consiglio. Molte installazioni NuGet (ad esempio DotLess) aggiungeranno voci alle sezioni che si applicano alla modalità integrata e duplicheranno tale impostazione per la modalità non integrata. Si chiama portabilità e consente alla configurazione di funzionare indipendentemente dal fatto che si stia utilizzando IIS7 / integrato o classico. L'unico motivo per cui lasciare questa impostazione di convalida trueè in modo da poter lasciare le ruote di allenamento accese e far urlare IIS ogni volta che aggiungi un'impostazione che non funzionerà in modalità integrata. Questo è per gli inesperti, ma si mette in mezzo.
Kirk Woll,

5
Questo tipo di configurazione è fastidioso. @MS: c'è un modo migliore.
yonexbat,

3
Per coloro che preferiscono correggere gli errori rispetto ai sintomi di mascheramento, ho pubblicato una risposta alternativa. Per quanto riguarda i pacchetti NuGet, perché stiamo ancora prendendo di mira IIS 6 / Classic?
Jeremy Cook,

104

L'aggiunta <validation validateIntegratedModeConfiguration="false"/>risolve il sintomo, ma non è appropriato per tutte le circostanze. Avendo risolto questo problema alcune volte, spero di aiutare gli altri non solo a superare il problema, ma a capirlo. (Il che diventa sempre più importante quando IIS 6 sfuma nel mito e nelle voci.)

Sfondo:

Questo problema e la confusione che lo circonda sono iniziati con l'introduzione di ASP.NET 2.0 e IIS 7. IIS 6 aveva e continua ad avere solo una modalità pipeline, ed è equivalente a ciò che IIS 7+ chiama la modalità "Classica". La seconda, più recente e consigliata modalità pipeline per tutte le applicazioni in esecuzione su IIS 7+ è chiamata modalità "integrata".

Quindi, qual è la differenza? La differenza fondamentale è come ASP.NET interagisce con IIS.

  • Modalità classicaè limitato a una pipeline ASP.NET che non può interagire con la pipeline IIS. Essenzialmente arriva una richiesta e se a IIS 6 / Classic è stato comunicato, tramite la configurazione del server, che ASP.NET è in grado di gestirlo, IIS passa la richiesta ad ASP.NET e continua. Il significato di questo può essere ricavato da un esempio. Se dovessi autorizzare l'accesso a file di immagini statiche, non sarei in grado di farlo con un modulo ASP.NET perché la pipeline IIS 6 gestirà tali richieste e ASP.NET non vedrà mai quelle richieste perché non sono mai state trasmesse * D'altra parte, autorizzare quali utenti possono accedere a una pagina .ASPX come una richiesta per Foo.aspx è banale anche in IIS 6 / Classic perché IIS trasmette sempre tali richieste alla pipeline ASP.NET. Nella modalità classica ASP.NET non sa cosa non ha

  • La modalità integrata è consigliata poiché i gestori e i moduli ASP.NET possono interagire direttamente con la pipeline IIS. La pipeline IIS non trasferisce più semplicemente la richiesta alla pipeline ASP.NET, ora consente al codice ASP.NET di collegarsi direttamente alla pipeline IIS e a tutte le richieste che la soddisfano. Ciò significa che un modulo ASP.NET non solo può osservare le richieste di file di immagini statiche, ma può intercettare quelle richieste e agire negando l'accesso, registrando la richiesta, ecc.

Superare l'errore:

  1. Se si esegue un'applicazione precedente che era stata originariamente creata per IIS 6, forse è stata spostata su un nuovo server, potrebbe non esserci assolutamente nulla di sbagliato nell'esecuzione del pool di applicazioni di quell'applicazione in modalità Classica. Vai avanti, non devi sentirti male.
  2. Poi di nuovo forse stai dando alla tua applicazione un lifting o stava andando bene fino a quando non hai installato una libreria di terze parti tramite NuGet, manualmente o in qualche altro modo. In tal caso è del tutto possibile httpHandlerso httpModulesè stato aggiunto a system.web. Il risultato è l'errore che stai vedendo a causa delle validateIntegratedModeConfigurationimpostazioni predefinite true. Ora hai due scelte:

    1. Rimuovere gli elementi httpHandlerse httpModulesda system.web. Ci sono un paio di possibili esiti da questo:
      • Tutto funziona bene, un risultato comune;
      • La tua applicazione continua a lamentarsi, potrebbe esserci un web.config in una cartella principale da cui stai ereditando, considera di ripulire anche quel web.config;
      • Ti stanchi di rimuovere il httpHandlerse httpModulesche i pacchetti NuGet continuano ad aggiungere system.web, ehi fai quello che ti serve.
  3. Se queste opzioni non funzionano o sono più problemi che ne vale la pena, allora io non ho intenzione di dirvi che non è possibile impostare validateIntegratedModeConfigurationa false, ma almeno si sa cosa si sta facendo e perché è importante.

Buona lettura:

* Naturalmente ci sono modi per ottenere qualsiasi tipo di cosa strana nella pipeline ASP.NET da IIS 6 / Classic tramite incantesimi come mappature di caratteri jolly , se ti piace quel genere di cose.


La sola soluzione +1 non è una risposta al tuo problema, ma una soluzione con una spiegazione che è la risposta perfetta. Che cos'è e perché dobbiamo cambiare questo, queste domande di risposta fornite dalla risposta di @Jeremy Cook.
Rikin Patel,

Questa spiegazione mi ha portato a risolvere il problema per un piccolo sito di test ospitato in IIS 7.5 in modalità integrata. Quando ho creato un nuovo progetto MVC, è stato aggiunto il modulo http, Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule nel mio Web.config. Questo perché ho lasciato l'opzione "Aggiungi Application Insights al progetto" selezionata durante la creazione di un nuovo progetto di applicazione Web ASP.NET. Quando ho rimosso httpModule da Web.config, il sito ha funzionato senza l'errore. L'impostazione validateIntegratedModeConfiguration su false ha funzionato, ma era solo un approccio bandaid.
iCode

2
È stata rilevata un'impostazione ASP.NET che non si applica in modalità pipeline gestita integrata. Questo è un altro inutile messaggio di errore Microsoft. ASP.net ha migliaia di impostazioni ma Microsoft non ha pensato di includere quella che ha causato l'errore nel testo dell'errore. La SM è gestita da marketeer piuttosto che da ingegneri, quindi non aspettatevi che le cose migliorino presto. :-(
Paul McCarthy,

35

Se è ancora necessario utilizzare il modulo HTTP, è necessario configurarlo (framework .NET 4.0) come segue:

<system.webServer>
   <modules runAllManagedModulesForAllRequests="true">
       <add name="MyModule" type="[Namespace].[Class], [assembly]"/>
   </modules>
   <validation validateIntegratedModeConfiguration="false"/>
</system.webServer>

2
Penso che la proprietà HttpModules in system.web sia per ASP 3.5 o prima. Per ASP 4 o versioni successive utilizzare i moduli in system.webserver
Trio Cheung

1
@HoyCheung è in realtà una questione di utilizzo della pipeline integrata o classica, non della versione di .Net, che decide se utilizzare system.web / httpModules o system.webServer / modules.
Pauli Østerø

29

Ho riscontrato questo problema ma ho avuto una soluzione diversa. Implicava l'aggiornamento Control Panel>Administrative Tools>IIS Managere il ripristino della pipeline gestita del mio sito app da Integrateda Classic.


3
D'accordo: questa è l'opzione migliore piuttosto che nascondere l'errore! Assicurati di utilizzare il pool di app corretto - dovrebbe essere Classic non integrato
Swomble il

1
Sto usando Visual Studio 2012, come posso cambiare il pool di app in classico.

10
Questa non è una buona soluzione se si desidera utilizzare tutte le nuove funzionalità disponibili in Pipeline integrata. Questo è come dire il ripristino di .NET 2.0 dalla 4.0 a causa di un problema.
Trevor de Koekkoek,

Per fare ciò in Gestione IIS, vai Application Poolsnella struttura a sinistra, fai doppio clic sul pool che desideri modificare e scegli la modalità pipeline.
Steve Smith,

8

Controlla se ci sono conflitti nell'autenticazione IIS. cioè si abilita l'autenticazione anonima e la rappresentazione ASP.NET entrambi potrebbero causare anche l'errore.


5

Nel tuo web.config assicurati che queste chiavi esistano:

<configuration>
    <system.webServer>
        <validation validateIntegratedModeConfiguration="false"/>
    </system.webServer>
</configuration>

Oltre a controllare Asp.Net Impresonation = Disabilita nell'autorizzazione del sito IIS


3

Mi sono imbattuto in questo problema e ispirato dalla risposta di @Jeremy Cook, ho morso il proiettile per scoprire cosa diavolo ha fatto sì che la modalità integrata IIS 7 non mi piacesse il mio web.config. Ecco il mio scenario:

  1. API Web (versione 4.0.030506.0 alias quella precedente)
  2. .NET 4.0
  3. Attribute Routing 3.5.6 per API Web [avviso spoiler: era questo ragazzo!]

Volevo usare il routing degli attributi in un progetto che (sfortunatamente) doveva usare .NET 4 e quindi non poteva usare Web API 2.2 (che necessita di .NET 4.5). Il pacchetto NuGet ben significato ha aggiunto questa sezione nella <system.web>sezione:

<system.web>
<httpHandlers>
      <add verb="*" path="routes.axd" type="AttributeRouting.Web.Logging.LogRoutesHandler, AttributeRouting.Web" />
    </httpHandlers>
</system.web>

[Dico bene significato, perché questa parte è richiesta nelle versioni precedenti di IIS]

La rimozione di questa sezione mi ha superato l'HTTP 500.23 !!

Riepilogo: secondo le parole di Jeremy, è importante capire perché le cose non funzionano piuttosto che semplicemente "mascherare il sintomo". Anche se devi mascherare il sintomo, sai cosa stai facendo (e perché) :-)


Grazie. Ho aggiunto AttributeRouting, compreso il pacchetto aggiuntivo NuGet del controller Api, e la rimozione della sezione indicata da web.config ha risolto il problema. Tuttavia, sono un po 'preoccupato perché la mia app Web MVC stava già utilizzando .NET Framework 4.5.
Robert Oschler,

2
@RobertOschler se sei su .NET 4.5, hai già il routing degli attributi incorporato in AFAIK - non dovresti aver bisogno di questo NuGet?
Sudhanshu Mishra,

Grazie e merda. Sono passate alcune ore oggi a ottenere il pacchetto AttributeRouting con NuGet. L'ho estratto e ho annullato tutte le "correzioni" di codice che ho aggiunto per farlo funzionare e ho sostituito l'attributo Route () API Web 2 per l'attributo GET (). Ha funzionato alla grande. In questi giorni abbiamo davvero bisogno di un sistema esperto solo per aiutarci con tutti questi pacchetti.
Robert Oschler,

2

Questo ha funzionato per me:

  1. Elimina il sito creato originariamente.
  2. Ricrea il sito in IIS
  3. Soluzione pulita
  4. Crea soluzione

Sembra che qualcosa sia andato a sud quando ho originariamente creato il sito. Odio soluzioni simili a "Riavvia il computer, quindi reinstalla Windows" senza sapere cosa ha causato l'errore. Ma questo ha funzionato per me. Veloce e semplice Spero che aiuti qualcun altro.


0

Nel mio caso mi mancava la dll nella cartella bin a cui faceva riferimento il file web.config. Quindi controlla se stavi usando qualche impostazione in web.config ma in realtà non hai dll.

Grazie


0

Mi ci sono volute alcune ore per risolverlo perché tutte le impostazioni che ho trovato qui su questo errore erano le stesse ma ancora non funzionava. Il problema era che avevo una cartella nel mio servizio web da cui il file doveva essere inviato al dispositivo WinCE, dopo aver convertito quella cartella in un'applicazione con Classic.NetAppPool ha iniziato a funzionare.


0

Di seguito il passaggio ha risolto il mio problema:

Apri CMDRichiedi con privilegi di amministratore.

Correre : iisreset.

Spero che sia di aiuto.


-1

Il metodo per local È l'errore

Immagine


7
Non modificare questa impostazione se non sai davvero cosa stai facendo. Questa non è quasi mai la risposta corretta.
NickG,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.