为什么IIS 7没有返回JSON错误?适用于我的*机器

Jac*_*Ace 8 .net iis wcf json .net-4.0

我遵循以下博客文章中的原则,当我使用Visual Studio 2010的内置Web服务器调试WCF服务时,我得到了我期望的行为.

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

当我的应用程序抛出FaultException()时,我可以在本地计算机上看到该错误的JSON表示.应用程序还返回适当的HttpStatusCode(在本例中为401 Unauthorized),这是所需的行为.

{"Code":"UserNotLoggedInFault","DisplayText":"You must be logged in to access this resource.","InternalText":"User is not logged in"}
Run Code Online (Sandbox Code Playgroud)

当我将我的应用程序部署到IIS 7.0时,我得到了正确的HttpStatusCode,但返回的html是与状态代码关联的通用文本:

您无权查看此目录或页面.

因为这在本地工作,我认为问题是IIS配置设置.我已经删除了拦截错误状态的IIS:错误页面值(它用于从%SystemDrive%\ inetpub\custerr \\ 401.htm返回格式化的HTML)

有没有人知道我需要更改哪些IIS设置,以便在返回200范围之外的HTTP状态时允许JSON响应通过?......或者我还需要做些什么呢?


更新#1

当我的应用程序抛出一个也将HttpStatusCode设置为Unauthorized(401)的FaultException时,似乎只会发生这种情况.如果我的应用程序返回状态代码404 Not Found,则正确返回JSON.

问题仍然存在,但我认为它仅适用于返回401 Unauthorized状态代码.

以下是Charles Web Proxy捕获的响应的一些屏幕截图

http://imgur.com/a/MkRRI

这是我点击本地机器时的样子

http://imgur.com/a/RMmsa


更新#2

因此,如果我将桌面远程登录到服务器并通过localhost访问该站点,则不会发生这种情况.当我点击需要身份验证的URL时,我会返回正确的JSON对象.

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

那么这是否意味着IIS以不同方式处理401状态代码,并且未经身份验证的用户会受到正确响应的屏蔽?

小智 10

我们在IIS"错误页面"配置中找到了一个修复该行为的设置.

您需要将错误响应设置为"详细错误",默认为"详细说明本地请求的错误和远程请求的自定义错误页面".您可以在网站或服务器范围内进行设置.

似乎该功能决定显示401的自定义错误页面,而不是向未经授权的客户端提供更多详细信息.

只需确保您的服务错误处理屏蔽了异常,否则客户端可以看到堆栈跟踪.


Che*_*eso -1

浏览器会生成“您没有权限”。我想您正在浏览器中查看对请求的响应;我猜是IE。

鉴于 401 响应,IE 正在为您生成“友好”页面。IE 不是 json 客户端,它认为调用者是人类(几乎总是正确的)。所以它正在显示一个人性化的页面。

如果您使用 Fiddler、wget.exe 或其他一些非浏览器工具点击该 URL,您将看到带有 401 状态代码和 json 响应的正确输出。

不确定其他浏览器上会发生什么。

有关 IE 中“友好”错误页面的更多信息,包括如何关闭它们,请参阅Eric Lawrence(Fiddler 的作者)的这篇文章