我遵循以下博客文章中的原则,当我使用 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 捕获的响应截图
这是我点击本地机器时的样子
更新#2
因此,如果我将桌面远程访问服务器并通过 localhost 访问该站点,则不会发生这种情况。当我点击需要身份验证的 URL 时,我会返回正确的 JSON 对象。
那么这是否意味着 IIS 以不同的方式处理 401 状态代码,并且未经过身份验证的用户无法获得正确的响应?