2012-06-14 15 views
7

Estoy siguiendo los principios de la siguiente publicación de blog y obtengo el comportamiento que espero cuando depuro mi Servicio WCF utilizando el servidor web integrado de Visual Studio 2010.¿Por qué IIS 7 no devuelve fallas JSON? Funciona en * mi * máquina

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

Cuando mi solicitud lanza una FaultException(), que se puede ver la representación JSON de ese fallo en mi máquina local. La aplicación también devuelve el HttpStatusCode apropiado (en este caso, 401 no autorizada), que es el comportamiento deseado.

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

Cuando despliego mi solicitud a IIS 7.0, sin embargo, tengo la HttpStatusCode correcta, pero el HTML devuelto es el texto genérico que se asocia con el código de estado:

Usted no tiene permiso para ver este directorio o página.

Como esto funciona localmente, supongo que el problema es una configuración de IIS. Ya he eliminado los valores de IIS: Páginas de error que interceptaban estados de error (solía devolver el HTML formateado de% SystemDrive% \ inetpub \ custerr \\ 401.htm)

¿Alguien sabe qué configuración de IIS necesito cambiar? permitir que pase la respuesta JSON cuando se devuelve un estado HTTP fuera del rango 200? ... o tal vez hay algo más que necesito hacer?


ACTUALIZACIÓN # 1

Esto sólo parece estar sucediendo cuando mi solicitud lanza una FaultException que también establece el HttpStatusCode a no autorizado (401). Si mi aplicación devuelve un código de estado de 404 No encontrado, entonces el JSON se devuelve correctamente.

La pregunta sigue en pie, pero supongo que solo se aplica a la devolución de un código de estado 401 no autorizado.

Estas son algunas capturas de pantalla de la respuesta como se recoge en Web Proxy Charles

http://imgur.com/a/MkRRI

Esto es lo que parece cuando llegué a mi máquina local

http://imgur.com/a/RMmsa


ACTUALIZACIÓN # 2

Así que esto no ocurre si el escritorio remoto en el servidor y golpear el sitio a través de localhost. Cuando presiono mi URL que requiere autenticación, obtengo el objeto JSON adecuado devuelto.

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

hace ese medio que IIS trata a 401 código de estado de forma diferente y que los usuarios no autenticados están protegidos de la respuesta correcta?

+0

¿Cuál es su alojamiento local - IIS o IIS Express? ¿Eres capaz de convertirte en respuestas de otros sitios en el servidor? – Regfor

+0

Localmente, ejecuto WebDev.WebServer40.exe. En mi servidor IIS 7 de Windows Server 2008, puedo POSTAR y OBTENER objetos JSON y todo funciona bien, excepto cuando arrojo una excepción de error. Cuando lo tiro localmente, obtengo la estructura JSON. Cuando lo arrojo a mi caja de Windows Server/IIS, aparece el mensaje "No tiene permiso para ver este directorio o página". respuesta. – JackAce

+0

Y qué ocurre con otras aplicaciones web o servicios del servidor. ¿Eres capaz de realizar llamadas HTTP exitosas a otra cosa desde el servidor? – Regfor

Respuesta

-1

El navegador genera el mensaje "No tiene permiso". Supongo que está viendo la respuesta a la solicitud en un navegador; Supongo IE.

IE está generando esa página "amigable" para usted, dada la respuesta 401. IE no es un cliente json, y cree que el que llama es un humano (casi siempre correcto). Por lo tanto, muestra una página amigable para los humanos.

Si hace clic en esa URL con Fiddler, o con wget.exe o alguna otra herramienta que no sea del navegador, verá la salida correcta con el código de estado 401 y la respuesta json.

No estoy seguro de lo que sucede en otros navegadores.

Para obtener más información sobre las páginas de error "amigables" en IE, incluida la forma de desactivarlas, consulte this article from Eric Lawrence (author of Fiddler).

+1

* No * está siendo generado por el navegador. Estoy usando Charles como un proxy web y el texto de respuesta muestra "No tiene permiso para ver este directorio o página". – JackAce

+0

Aquí hay algunas capturas de pantalla de la respuesta de Charles Web Proxy http://imgur.com/a/MkRRI – JackAce

+0

No sé cómo funciona Charles. ¿Podrías usar Fiddler? (Por ejemplo, Charles no depende de Java). ¿Qué hay de wget? ¿Rizo? incluso un jscript usando XmlHttpRequest? Verificaría dos veces lo que Carlos te está diciendo. ¿Su aplicación realmente ve el mensaje "No tiene permiso ..."? ¿O está viendo eso solo en las herramientas de diagnóstico que está utilizando? Todavía parece que ese mensaje está siendo inyectado por algo en la cadena de herramientas, no por IIS. – Cheeso

6

Encontramos una configuración en la configuración de "páginas de error" de IIS que corrige ese comportamiento.

Debe establecer las respuestas de error en "Errores detallados", el valor predeterminado es "Errores detallados para solicitudes locales y páginas de error personalizadas para solicitudes remotas". Puede configurarlo en su sitio web o en todo el servidor.

Parece que la característica decide mostrar la página de error personalizado para 401 en lugar de dar más detalles a un cliente no autorizado.

Solo asegúrese de que el tratamiento de errores de servicio proteja la excepción, de lo contrario, el cliente puede ver un stacktrace.

+0

Esto resolvió un problema similar para mí. Intentaba devolver un estado de 400 con un json descriptivo para solicitudes no válidas. En mi máquina funcionaba muy bien, en el servidor obtenía la respuesta html de IIS. @Hector - ¡gracias! –

Cuestiones relacionadas