【问题标题】:Retrieve content from 404 error using HttpWebRequest使用 HttpWebRequest 从 404 错误中检索内容
【发布时间】:2012-10-16 09:11:33
【问题描述】:

这类似于此处提出的问题:httpWebRequest - get error content 但我希望提供更多信息以期得到答案。

我正在使用 C# 与 LinkedIn API 集成。当我对 API 进行 invalid 调用时,它可以返回类似这样的 HTTP 响应(来自 Fiddler):

HTTP/1.1 404 Not Found
Server: Apache-Coyote/1.1
x-li-request-id: VL2EER2ROJ
Date: Tue, 16 Oct 2012 08:52:59 GMT
Vary: *
x-li-format: xml
Content-Type: text/xml;charset=UTF-8
Content-Length: 266

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<error>
  <status>404</status>
  <timestamp>1350377580000</timestamp>
  <request-id>VL2EER2ROJ</request-id>
  <error-code>0</error-code>
  <message>Could not find member {/people/XXXXXX}</message>
</error>

我特别想了解错误 xml,但是 HttpWebRequest 似乎只是抛出异常,然后与内容无关。在我的调试器中,我可以看到内容长度为 266,但任何调用 (System.Net.WebException).Response.GetResponseStream() 的尝试都会导致 stream was not readable 异常。

这种在非 200 HTTP 状态响应中返回错误消息的方法在 Web API 中似乎很流行 - 我希望有一种方法可以获取这些响应...

【问题讨论】:

  • 这是什么版本的 .NET?这听起来像一个错误。获取 system.net 跟踪日志并使用它在 msdn 社区站点上创建错误报告。顺便说一句,您可以显示您的代码吗?也许有一些东西可以改变以使这项工作?
  • Read the manual: "注意:如果抛出 WebException,请使用异常的 Response 和 Status 属性来确定来自服务器的响应。” 另见this duplicate
  • @CodeCaster :如问题中所述,尝试访问响应流会导致“无法从流中读取”异常。引用副本中提供的答案不正确
  • @feroze 这发生在 .NET 4.0 中(我假设所有早期版本)。我倾向于同意你的观点,这是框架中的一个错误
  • @GrantDG 请出示您的代码。如果您使用catch (WebException wex) { var resp = new StreamReader(wex.Response.GetResponseStream()).ReadToEnd(); },它应该可以工作。这很可能不是框架中的错误,而是您的代码中的错误,否则很多人会遇到它。

标签: c# .net api httpwebrequest linkedin


【解决方案1】:

您可能需要直接点击套接字连接以获取响应 xml。

看到这个答案:https://stackoverflow.com/a/6755142

我在尝试实施亚马逊的非亚马逊支付 API 时遇到了同样的问题。如果我传递了无效的事务 ID,它们会返回 404 错误...不是我所期望的。

另外值得注意的是:我在发送 http 帖子时使用异步,这个 404 会在 BeginGetResponse 方法上引发 WebException;不是在尝试读取回调中的响应时。相反,在回调中读取响应流时会引发 400 Bad Request WebException。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    相关资源
    最近更新 更多