8

我遵循以下博客文章中的原则,当我使用 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"}

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

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

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

有谁知道当返回 200 范围之外的 HTTP 状态时,我需要更改哪些 IIS 设置以允许 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 状态代码,并且未经过身份验证的用户无法获得正确的响应?

4

2 回答 2

10

我们在 IIS“错误页面”配置中找到了修复该行为的设置。

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

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

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

于 2012-11-08T21:26:13.270 回答
-1

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

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

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

不知道在其他浏览器上会发生什么。

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

于 2012-06-14T20:40:03.457 回答