2012-06-14 8 views
7

Sto seguendo i principi del seguente post sul blog e sto ottenendo il comportamento che mi aspetto quando eseguo il debug del servizio WCF utilizzando il server Web incorporato di Visual Studio 2010.Perché IIS 7 non restituisce errori JSON? Funziona su * my * machine

http://zamd.net/2008/07/08/error-handling-with-webhttpbinding-for-ajaxjson/

Quando la mia applicazione genera un FaultException(), posso vedere la rappresentazione JSON di quella colpa sulla mia macchina locale. L'applicazione restituisce anche il HttpStatusCode appropriato (in questo caso, 401 Non autorizzato), che è il comportamento desiderato.

{"Code":"UserNotLoggedInFault","DisplayText":"You must be logged in to access this resource.","InternalText":"User is not logged in"} 

Quando schiero la mia domanda di IIS 7.0, però, ho la HttpStatusCode corretto, ma il codice HTML restituito è il testo generico che viene associato al codice di stato:

Non hai il permesso per visualizzare questa directory o pagina.

Poiché ciò funziona localmente, presuppongo che il problema sia un'impostazione di configurazione IIS. Ho già rimosso IIS: Valori pagine di errore che intercettavano stati di errore (utilizzato per restituire HTML formattato da% SystemDrive% \ inetpub \ custerr \\ 401.htm)

Qualcuno sa quali sono le impostazioni di IIS che è necessario modificare consentire alla risposta JSON di passare quando viene restituito uno stato HTTP al di fuori dell'intervallo 200? ... o forse c'è qualcos'altro che devo fare?


UPDATE # 1

Questo appare solo accadere quando la mia applicazione genera un FaultException che imposta anche il HttpStatusCode per Unauthorized (401). Se la mia applicazione restituisce un codice di stato 404 non trovato, il JSON viene restituito correttamente.

La domanda è valida, ma suppongo che si applichi solo alla restituzione di un codice di stato non autorizzato 401.

Ecco alcuni screenshot della risposta come catturato da Charles proxy Web

http://imgur.com/a/MkRRI

Ecco quello che sembra quando ho colpito mia macchina locale

http://imgur.com/a/RMmsa


UPDATE # 2

Quindi questo è non si verifica se ho il desktop remoto nel server e colpisco il sito tramite localhost. Quando raggiungo l'URL che richiede l'autenticazione, viene restituito l'oggetto JSON corretto.

http://i.imgur.com/J5oNn.png

Quindi questo significa che IIS tratta 401 codice di stato in modo diverso e che gli utenti non autenticati sono schermati dalla risposta adeguata?

+0

Qual è il tuo hosting locale - IIS o IIS Express? Sei in grado di ottenere risposte da altri siti sul server? – Regfor

+0

Localmente, eseguo WebDev.WebServer40.exe. Sul mio server IIS 7 di Windows Server 2008, posso POST e ottenere oggetti JSON e tutto funziona alla grande, tranne quando lancio una FaultException. Quando lo lancio localmente, ottengo la struttura JSON. Quando lo lancio sulla mia casella di Windows Server/IIS, ottengo il messaggio "Non hai l'autorizzazione per visualizzare questa directory o pagina". risposta. – JackAce

+0

E le altre app web o servizi dal server. Sei in grado di effettuare chiamate HTTP riuscite a qualcos'altro dal server? – Regfor

risposta

-1

Il "Non si dispone dell'autorizzazione" viene generato dal browser. Suppongo che stai visualizzando la risposta alla richiesta in un browser; Sto indovinando IE.

IE sta generando quella pagina "amichevole" per te, data la risposta 401. IE non è un client json e pensa che il chiamante sia umano (quasi sempre corretto). Quindi sta visualizzando una pagina a misura d'uomo.

Se si solletizza quell'URL con Fiddler o con wget.exe o qualche altro strumento non browser, verrà visualizzato l'output corretto con il codice di stato 401 e la risposta JSON.

Non so cosa succede su altri browser.

Per ulteriori informazioni sulle pagine di errore "amichevoli" in IE, incluso come disattivarle, vedere this article from Eric Lawrence (author of Fiddler).

+1

È * non * generato dal browser. Sto usando Charles come proxy web e il testo della risposta mostra "Non hai l'autorizzazione per visualizzare questa directory o pagina". – JackAce

+0

Ecco alcuni screenshot della risposta del proxy Web Charles http://imgur.com/a/MkRRI – JackAce

+0

Non so come funzioni charles. Potresti usare Fiddler? (A parte charles solo non dipende da Java). Che mi dici di wget? Arricciare? anche un jscript usando XmlHttpRequest? Vorrei ricontrollare ciò che Charles ti sta dicendo. La tua applicazione visualizza effettivamente il messaggio "Non hai il permesso ..."? O lo vedi solo negli strumenti diagnostici che stai utilizzando. Sembra ancora che il messaggio sia stato iniettato da qualcosa nella catena di strumenti, non da IIS. – Cheeso

6

Abbiamo trovato un'impostazione nella configurazione "Pagine di errore" di IIS che corregge tale comportamento.

È necessario impostare le risposte di errore su "Errori dettagliati", l'impostazione predefinita è "Errori di dettaglio per richieste locali e pagine di errore personalizzate per richieste remote". Puoi impostarlo nel tuo sito Web o in tutto il server.

Sembra che la funzione decida di mostrare la pagina di errore personalizzata per 401 invece di fornire maggiori dettagli a un client non autorizzato.

Assicurati che il tuo errore di manutenzione gestisca l'eccezione, altrimenti il ​​client può vedere uno stacktrace.

+0

Questo ha risolto un problema simile per me. Stavo cercando di restituire uno stato di 400 con qualche frase descrittiva per richieste non valide. Sulla mia macchina funzionava alla grande, sul server, avrei avuto la risposta HTML IIS. @Hector - grazie! –

Problemi correlati