Il {"messaggio" di WebApi: "si è verificato un errore"} su IIS7, non in IIS Express


171

Sto lavorando con ASP.NET MVC 4 WebApi e mi diverto molto a farlo eseguirlo sul mio computer locale su IIS Express. Ho configurato IIS Express per servire anche macchine remote, e così altri nella mia azienda stanno usando il mio computer come nostro server web.

Dopo aver deciso che si trattava di una soluzione tutt'altro che ottimale, abbiamo deciso di collocare WebApi su un server remoto dopo l'installazione di .NET 4.5. Quando uso il violinista e ho inviato un POST a un controller sul mio computer locale, restituisce la risposta corretta, ma quando cambio il dominio al server web che esegue IIS7, lo stesso POST restituisce un criptico

{"message": "si è verificato un errore"}

Messaggio. Qualcuno ha idea di cosa potrebbe succedere?


2
Qual è il codice di stato HTTP sulla risposta all'errore? Se è 500 è molto probabile che la configurazione del sito Web / dell'applicazione non sia valida per il computer remoto con IIS 7. Creare un semplice file HTML sul computer remoto, sfogliarlo sul computer remoto se possibile per assicurarsi che possa essere visualizzato e quindi provare per colpirlo dalla tua macchina per vedere se ha successo o meno.
Sixto Saez,

È un errore 500. Grazie per il suggerimento, ma la pagina index.html predefinita fornita da WebApi funziona. Inoltre dovrebbe aggiungere che alcuni dei servizi Web API funzionano e altri no, mentre tutti funzionano sul mio computer locale.
nsg

2
Dovrai abilitare la traccia delle richieste IIS per ottenere dettagli più specifici quando vedi un errore 500. Di solito si verifica un errore 500 prima che il routing dell'API Web inizi, ma immagino che sia possibile innescarlo da qualcosa che il tuo codice sta facendo. Guarda la registrazione della traccia IIS e vedi se offre qualche indizio.
Sixto Saez,

1
Potresti essere in grado di convincere il server a fornirti informazioni più dettagliate sull'errore nella sua risposta avviando la richiesta da un browser sul computer server stesso (ad esempio utilizzando una sessione di Desktop remoto).
Jon Schneider,

Risposte:


268

Il problema era una dipendenza mancante che non era sul server ma sul mio computer locale. Nel nostro caso, è stata una dll Devart.Data.Linq.

Per arrivare a quella risposta, ho attivato la traccia IIS per 500 errori. Ciò ha fornito un po 'di informazioni, ma la cosa veramente utile è stata nell'impostazione web.config che <system.web><customErrors mode="Off"/></system.web>Questo indicava una dipendenza mancante caricata dinamicamente. Dopo aver aggiunto questa dipendenza e aver detto che doveva essere copiato localmente, il server ha iniziato a funzionare.


33
Sembra che WebAPI sostituirà {"message": "si è verificato un errore"} per la risposta reale ogni volta che il codice di risposta HTTP è 500 e gli errori personalizzati sono attivi. Grazie per il puntatore.
Paul Suart,

4
Ottimo suggerimento sull'impostazione della modalità CustomErrors. Sono sorpreso del cambiamento che ha avuto un impatto sull'output di questo tipo di errori.
Dewi Rees,

1
puoi anche impostarlo su mode="RemoteOnly"e se esegui la pagina su un browser web sul server vedrai anche gli errori senza compromettere la sicurezza se il resto del sito è accessibile dall'esterno
Simon_Weaver

Qualche suggerimento su come ottenere questo tipo di dettagli di errore quando si modifica quell'impostazione non è possibile (ad esempio, gli errori sono disabilitati a livello di macchina perché la parte API è ospitata su un server compatibile PCI)? Ho provato a configurare Elmah, ma sfortunatamente non sta registrando nulla.
RubyHaus,

Questo è l'approccio migliore, fornisce informazioni sufficienti su un metodo così generico.
DanielV,

97

Fondamentalmente:

Usa IncludeErrorDetailPolicyinvece se CustomErrorsnon lo risolve per te (ad esempio se lo stack ASP.NET è> 2012):

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy 
= IncludeErrorDetailPolicy.Always;

Nota: fare attenzione a restituire informazioni dettagliate sull'errore in grado di rivelare informazioni sensibili agli "hacker". Vedi il commento di Simon su questa risposta di seguito.

TL; versione DR

Per me CustomErrorsnon mi è stato di grande aiuto. Era già impostato su Off, ma ho ancora ricevuto solo un misero an error has occurredmessaggio. Immagino che la risposta accettata sia di 3 anni fa, che è molto tempo nella parola web al giorno d'oggi. Sto usando Web API 2 e ASP.NET 5 (MVC 5) e Microsoft si è allontanata da una strategia solo IIS, mentre CustomErrorsè vecchio skool IIS;).

Comunque, ho avuto un problema di produzione che non avevo localmente. E poi ho scoperto che non potevo vedere gli errori nella scheda Rete di Chrome come potevo sul mio computer di sviluppo. Alla fine sono riuscito a risolverlo installando Chrome sul mio server di produzione e quindi accedendo all'app lì sul server stesso (ad esempio su "localhost"). Quindi sono comparsi errori più dettagliati con tracce dello stack e tutto il resto.

Solo in seguito ho trovato questo articolo di Jimmy Bogard (Nota: Jimmy è il signor AutoMapper! ). La cosa divertente è che anche il suo articolo è del 2012, ma in esso spiega già che CustomErrorsnon aiuta più per questo, ma che PUOI cambiare il 'Dettaglio errore' impostando un diverso IncludeErrorDetailPolicynella configurazione WebApi globale (es. WebApiConfig.cs):

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy 
= IncludeErrorDetailPolicy.Always;

Fortunatamente, spiega anche come configurarlo in modo che webapi (2) ascolti le tue CustomErrorsimpostazioni. Questo è un approccio abbastanza sensato, e questo ti consente di tornare al 2012: P.

Nota: il valore predefinito è "LocalOnly", il che spiega perché sono stato in grado di risolvere il problema nel modo descritto, prima di trovare questo post. Ma capisco che non tutti possono semplicemente remoto alla produzione e all'avvio di un browser (so che per lo più non potrei fino a quando non ho deciso di diventare freelance E DevOps).


2
Ora funziona. Grazie! Ho alcuni tipi di test in-memory-integration-owin che falliscono sul server di compilazione, ma non localmente. Con questa impostazione nella mia classe di avvio, potrei avere la possibilità di capire perché.
Thomas Eyde,

Sembra che l'impostazione customError funzioni con WebApi 2 quando è ospitata in IIS tramite Microsoft.AspNet.WebApi.WebHost. I pacchetti sono la versione 5.2.3, quindi lo stack ASP.NET supera il 2012. Impostandolo su Off, l'API Web passa da errori generici a più dettagliati, contenenti lo stack di chiamate, ecc ...
Tom,

4
Fai attenzione a impostarlo perché può rivelare informazioni sensibili agli "hacker". Farò spesso un trucco rapido if (DateTime.Now < new DateTime(2017, 6, 22)) { .... }per impostare un'opzione come questa. Quindi posso provarlo in produzione e domani tornerà magicamente al comportamento normale se dimentico di disabilitarlo.
Simon_Weaver,

36

Nessuna delle altre risposte ha funzionato per me.

Questo ha fatto: (in Startup.cs)

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var config = new HttpConfiguration();

        WebApiConfig.Register(config);

        // Here: 
        config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
    }
}

(oppure puoi inserirlo in WebApiConfig.cs):

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        // Here: 
        config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
    }
}

Sì !, Questa è stata l'unica soluzione funzionante per me su Mono / Linux.
Robert II

Questo ha funzionato per me su prod per un'app servita internamente su IIS e Windows Server.
Paul Carlton,

config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; mi ha aiutato a scoprire che restituisco un'istanza di un'entità che non può essere analizzata perché il contesto è stato eliminato, grazie
Jood jindy,

12

Sono sempre arrivato a questa domanda quando ho riscontrato un errore nell'ambiente di test e ricordo: "L'ho già fatto prima, ma posso farlo direttamente nel web.config senza dover modificare il codice e ridistribuire nell'ambiente di test , ma sono necessarie 2 modifiche ... che cos'è stato di nuovo? "

Per riferimento futuro

<system.web>
   <customErrors mode="Off"></customErrors>
</system.web>

E

<system.webServer>
  <httpErrors errorMode="Detailed" existingResponse="PassThrough"></httpErrors>
</system.webServer>

11

Ho avuto un problema simile durante la pubblicazione nell'endpoint WebAPI. Disattivando CustomErrors = Off, sono stato in grado di vedere l'errore effettivo che mancava in una delle DLL.


10

Nel caso in cui ciò aiuti chiunque:

Ho avuto un problema simile e ho aggiunto le seguenti istruzioni Nates:

<system.web>
     <customErrors mode="Off"/>
 </system.web>

Questo mi ha mostrato ulteriori informazioni sull'errore:

"ExceptionMessage": "Impossibile caricare la risorsa metadati specificata.", "ExceptionType": "System.Data.Entity.Core.MetadataException", "StackTrace": "at System.Data.Entity.Core.Metadata.Edm.MetadataArtifactLoaderCompositeResource .LoadResources (...

Questo è quando mi sono ricordato di aver spostato il file edmx in una posizione diversa e di aver dimenticato di cambiare il nodo delle stringhe di connessione nella configurazione (il nodo delle connessioni è stato inserito in un file separato usando "configSource", ma questa è un'altra storia).


Questo mi è successo quando ho aggiunto OData e AutoMapper a un'API Web in asp.net - si spera che queste parole chiave aiutino qualcuno a raggiungere questo post e provare / catturare non ha funzionato nel mio caso, quindi ho dovuto vedere il risultato grezzo
Ekus

0

Il mio file XML swagger non è stato distribuito in \ bin:

GlobalConfiguration.Configuration
  .EnableSwagger(c =>
  {
    c.SingleApiVersion("v1", "SwaggerDemoApi");
    c.IncludeXmlComments(string.Format(@"{0}\bin\SwaggerDemoApi.XML", 
                         System.AppDomain.CurrentDomain.BaseDirectory));
    c.DescribeAllEnumsAsStrings();
  })

http://wmpratt.com/swagger-and-asp-net-web-api-part-1/

inserisci qui la descrizione dell'immagine

Doveva essere impostato nella Configurazione di rilascio e nella Configurazione di debug.


0

Se hai <deployment retail="true"/>nel machine.config di .NET Framework, non vedrai messaggi di errore dettagliati. Assicurarsi che l'impostazione sia falsa o non presente.


0

Quindi ho provato tutte le soluzioni suggerite senza alcun risultato. Tutto quello che ho fatto è stato impostare l'esecuzione dal server e ha visualizzato l'errore per intero, questo avrebbe dovuto funzionare quando ho impostato la modalità customErrors su false, ma non è stato così. Nel momento in cui ho esplorato l'API dal server sono stato in grado di vedere il problema.

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.