2012-04-20 14 views
19

Ho un metodo POST controller Web API che si comporta bene localmente e sul server di test. Se tutto va bene ritorna:I messaggi di errore restituiti dal metodo API Web vengono omessi in ambiente non dev.

new HttpResponseMessage(HttpStatusCode.Created) 

Se qualcosa va storto, restituisce:

new HttpResponseMessage<IEnumerable<string>>(usefulMessages, HttpStatusCode.BadRequest); 

Il problema è che quando faccio una richiesta al server di prova che si traduce in un errore, ottengo il codice di richiesta errato indietro ma non vedo mai i messaggi. Se faccio la stessa identica richiesta al mio computer locale, vedo i messaggi. I seguenti uscite sono dal mio strumento:

Invio di una richiesta alla mia macchina locale ottengo:

Status code: 400 (BadRequest) 
Response data: ["Error message one", "Error message two"] 

Invio di una richiesta al server di prova ottengo:

Status code: 400 (BadRequest) 
Response data: Bad Request 

Il codice che è in esecuzione è esattamente lo stesso. Il database è lo stesso. Tutto è uguale ad eccezione del server che gestisce la richiesta. Ho persino il codice per mandarmi via email i messaggi di errore, quindi so che il server sta producendo i messaggi di errore corretti e si comporta correttamente. Potrebbe essere una cosa IIS (come l'equivalente di customErrors = RemoteOnly per Web API)? Non solo i messaggi di errore vengono omessi dai dati di risposta, qualcosa inventa invece la frase "Richiesta errata".

Qualche idea? Grazie.

risposta

1

Sembra che potrebbe essere la modalità personalizzata degli errori per me. WebAPI è in esecuzione su ASP.NET (MVC), quindi utilizza tutte le stesse impostazioni di web.config.

Se si tratta di un server di prova, è possibile provare a disattivare CustomErrors per verificare.

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

Questo non sembra funzionare. Se così fosse, genererebbe una nuova domanda: "Perché devo consentire agli utenti delle mie pagine Web di visualizzare le pagine di errore del server giallo con tracce di stack per fornire risposte al servizio Web informativo?". –

14

Date un'occhiata al this MSDN post sul HttpConfiguration.IncludesErrorDetailPolicy:

Nel vostro Global.asax:

var config = GlobalConfiguration.Configuration; 
config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; 

Ho usato questa proprietà di configurazione per forzare i messaggi di errore di includere i dettagli.

+2

Questo non sembra funzionare. Inoltre, sembra un po 'ampio. Vedi il mio commento alla domanda di Jason. Inoltre, ho lasciato questo commento tre giorni fa, e quando sono tornato oggi il commento non era qui e la risposta è stata (erroneamente) accettata. Non sono sicuro di cosa sia successo - mi dispiace per quello. –

1

Ci sono stati molti cambiamenti nella base di codice API Web dalla versione beta. Un sacco di meraviglie. Guarda come ottenere le build firmate notturne here.

Il generico HttpResponseMessage<T> non è più supportato. Utilizzare HttpRequestMessage.CreateResponse<T>. Vedi this e this.

Si vorrà aggiornare almeno alla build notturna corrente invece di utilizzare la versione beta se si prevede di mantenerla in futuro. Tanti buoni miglioramenti in particolare per le API Web.

EDIT: Nella mia mente, questo era in realtà legata alla tua domanda iniziale, perché, mentre non ho guardare dentro per una risposta concreta, sembra che la roba più recente restituisce risposte che non vengono intercettati da IIS . Potrebbe avere a che fare con la rielaborazione della gestione degli errori/segnalazione degli errori.

UPDATE 2012/08/14 L'attuale release candidate per MVC 4/Web API è abbastanza buono. Non è più necessario avere la build notturna a meno che non si desideri rimanere completamente aggiornati.

9

Aveva lo stesso problema. È infatti a causa dell'impostazione degli errori personalizzati.

In uno scenario reale, si consiglia di utilizzare una pagina di errore personalizzata nell'applicazione, ma affinché i messaggi di eccezioni personalizzati funzionino nella WebAPI è necessario disabilitare la pagina degli errori personalizzati.

Come risolvere il problema? Fortunatamente, puoi usare l'elemento <location> nel tuo web.config per risolvere questo problema.

Soluzione:

<!-- General for the application --> 
    <system.web> 
    <customErrors mode="RemoteOnly" defaultRedirect="YourCustomErrorPage.aspx"/> 
    </system.web> 

    <!-- Override it for paths starting with api (your WebAPI) --> 
    <location path="api"> 
    <system.web> 
     <customErrors mode="Off" /> 
    </system.web> 
    </location> 

Io uso questo metodo nel mio app, funziona bene.

Problemi correlati