【问题标题】:Webclient 404 protocol error on valid url c#有效 url c# 上的 Webclient 404 协议错误
【发布时间】:2016-01-24 14:58:01
【问题描述】:

我有一个webclient 调用URL,当我在浏览器中查看它时工作正常,这让我相信我需要在我的调用中添加标题

我已经这样做了,但仍然收到错误。

我确实有其他对相同 API 的调用可以正常工作,并检查了我传递的所有参数是否与预期完全相同(大小写、拼写)

using (var wb = new WebClient())
{
    wb.Proxy = proxy;
    wb.Headers.Add("Accept-Language", " en-US");
    wb.Headers.Add("Accept", " text/html, application/xhtml+xml, */*");
    wb.Headers.Add("User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"); 
    byte[] response = wb.UploadValues("http://myserver/api/account/GetUser",
                                      new NameValueCollection()
                                      {
                                          { "email", register.Email },
                                      });
    userDetails = Encoding.UTF8.GetString(response);
} 

有谁知道为什么在浏览器中运行良好的调用仍然出现协议错误?

【问题讨论】:

  • 请公布确切的错误。
  • 我得到的只是一个 404 未找到,当我打开详细信息时,它说的是 ProtocolError
  • 使用像wireshark或fiddler这样的嗅探器来比较webclient和你的代码。错误 404 可能意味着很多不同的事情。为了防止黑客进入网站,通常在发生故障时总是返回 404,并且没有给出故障的确切原因。
  • 只是为了确保将" en-US" 替换为"en-US"GetUser 函数是否需要 GET 或 POST http 操作?
  • 代理是否正确?

标签: c# webclient http-error


【解决方案1】:

UploadValue 使用 HTTP POST。你确定它是你想要的吗?如果您在浏览器中查看它,则很可能是 GET,除非您正在填写某种网络表单。

有人可能会猜测您正在尝试做的是获取此响应“http://myserver/api/account/GetUser?email=blah@blah.com

在这种情况下,您只需使用查询参数制定该 url,并使用 DownloadString 重载之一执行 GET。

using (var wb = new WebClient())
{
    wb.Proxy = proxy;
    userDetails = wb.DownloadString("http://myserver/api/account/GetUser?email=" + register.Email);
} 

The Wikipedia article on REST 有一个很好的表格,其中概述了每个 HTTP 动词的语义,这可能有助于为您的用例选择合适的 WebClient 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 2017-12-11
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 2021-09-23
    • 1970-01-01
    相关资源
    最近更新 更多