WCF中的自定义JSON IErrorHandler返回StatusCode 200/504时应该返回400

时间:2010-08-17 13:59:38

标签: wcf json http webhttpbinding ierrorhandler

我有一个WCF服务,其他绑定中也使用WebHttpBinding来获取JSON输入/结果。

我创建了一个自定义IErrorHandler实现,以便在出现问题时将StatusCode设置为400,并返回JSON可理解的消息。这是你可以在任何地方找到的直接实现(很好地描述了here)。

我的问题是:当我使用Visual Studio Web开发服务器(Cassini)在本地测试时,它可以很好地工作。但是,当我将它部署到我的测试服务器(带有IIS标准配置的Windows 2008以及其他所有服务器)时,它不起作用。

当我调用它并使用Firebug进行调试时,我得到一个HttpStatusCode 200作为返回而没有响应文本。使用Fiddler,我得到一个HttpStatusCode 504并且根本没有返回。但是,我期望的行为(以及本地发生的行为)是调用带有responseText设置的ajax调用的错误回调。

我远程调试它,一切看起来都很好。执行管道是正常的,所有类都被调用,因为它们应该就像在本地一样,除非它不起作用。

有什么建议吗?我几乎没有选择来解决这个问题。

非常感谢!

2 个答案:

答案 0 :(得分:0)

如果firebug和fiddler给出不同的结果,如果你直接telnet到它并执行请求会发生什么(如:):

    GET /VirtualDirectoryAndGetData HTTP/1.1
    HOST: example.com
    [carriage return]

如果你以某种方式获得奇怪的标题/格式化(解释为什么firebug / fiddler不同意),我不会感到惊讶

要测试的另一件事是发布到您的开发机器,看看它是机器特定问题还是服务器vs开发网络服务器问题。

如果它发生在VS以外的任何地方,您也可以尝试注释掉您设置的行

  rmp.StatusCode = System.Net.HttpStatusCode.BadRequest;
  rmp.StatusDescription = "Bad request";

这可能表明它是响应代码问题还是错误处理程序问题。

如果您可以编辑问题以包含结果(删除敏感信息),我们会看看是否可以进一步跟踪它。

再次查看问题之后,

编辑,可能是服务器在发送任何响应之前发生错误。 FF可能默认为200,而ie可能假定为504(网关超时)。这是完全的推测,但是可能。你在事件日志中看到了什么吗?

答案 1 :(得分:0)

我有一个类似的问题,我能够解决。看一下IIS设置。有关如何克服此问题的详细信息,请参阅此帖:IErrorHandler returning wrong message body when HTTP status code is 401 Unauthorized