【问题标题】:How to return HTTP 429?如何返回 HTTP 429?
【发布时间】:2014-05-03 09:57:58
【问题描述】:

我正在使用 WCF 实现一个 API,规范规定在某些情况下返回 HTTP 429。

通常我会简单地写:

throw new WebFaultException(HttpStatusCode.NotFound);

但是 HttpStatusCode 枚举不包含 429。

我显然可以转换为枚举

throw new WebFaultException((HttpStatusCode)429);

但是我担心这不会为调用我的 API 的应用程序产生正确的结果。

创建扩展 HttpStatusCode 并发送有效(但不受支持)HTTP 状态的最佳方法是什么?

【问题讨论】:

  • 找到这个松散相关的链接。它没有回答问题,但可能会提供背景:stackoverflow.com/questions/2022887/…
  • 发送未注册状态码需要什么样的规范?
  • @JulianReschke 如果您检查 HTTP 规范 429 确实是有效代码 - 只是 .NET 不支持在枚举中包含它
  • @Liath:Julian 致力于 HTTP 规范。 :-) tools.ietf.org/html/rfc6585#section-4 是 HTTP/429 的提议。
  • @JulianReschke 虽然 RFC 2616 中没有提到 429 Too Many Requests,但在 RFC 6585 中提到了它。FWIW,虽然我没有将它与 WCF 一起使用,但我在 ASP.NET 中发现了这一点将 HttpResponse.StatusCode 设置为 429 会得到正确的数字,但不是正确的字符串,因此必须同时设置 StatusDescription,或者只设置 Status。我担心 WCF 最终可能会得到类似的部分正确结果,因为它与 ASP.NET 的代码相同。

标签: c# http wcf http-status-code-429


【解决方案1】:

如果有人使用 webApi 模板,控制器将返回一个 IActionResult 对象。

return new StatusCodeResult(429);

这对我有用。

【讨论】:

    【解决方案2】:

    可以直接使用HttpStatusCode

    HttpStatusCode.TooManyRequests

    【讨论】:

    • 嗨 Teepi - 你能补充一点信息吗?自从我发布问题以来,枚举是否已更新,或者这是一个不同的问题?
    • 这是实际的 HttpStatusCode 枚举
    • 在 .net 4.7.2 中不存在,可能需要添加您正在使用的版本。
    • Framework 4.8 没有枚举 429,但它存在于 .NET Framework 5.0 Preview 7 中。它在 2.1 中添加到 Standard 和 Core。
    【解决方案3】:

    来自C# Language Specification 5.0

    枚举类型可以采用的值集不受其限制 枚举成员。特别是,基础类型的任何值 enum 可以转换为 enum 类型并且是一个不同的有效值 那个枚举类型。

    所以这是完全没问题的,也是你最好的选择:

    throw new WebFaultException((System.Net.HttpStatusCode)429);
    

    【讨论】:

    • 从语言的角度来看是可以的,但这并不意味着API会正确处理它......
    • 这里的异常是从 API 抛出的。处理该异常是调用者的责任。
    • 谢谢。我想返回“锁定”423。很高兴知道强制转换会起作用。
    • 我可以确认这种类型的转换在 .NET Framework 4.8 中工作得很好,其中“TooManyRequests”没有在 HttpStatusCode 枚举中明确定义——以防万一访问这篇文章的人不清楚。
    • 今天我学到了
    【解决方案4】:

    如果您使用 IIS 托管 WCF 服务,您可以打开 ASP.Net Compatibility Mode。完成后,您可以将HttpContext.Current.Response.StatusCode 的状态设置为 429。

    话虽如此。我认为您最好的选择是尝试将 429 转换为 HttpStatusCode 并查看会发生什么。如果这行得通,那么您就可以省去头疼的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-28
      • 1970-01-01
      • 1970-01-01
      • 2020-11-28
      • 1970-01-01
      • 2016-02-16
      • 2012-10-24
      • 2019-08-21
      相关资源
      最近更新 更多