【问题标题】:403 Forbidden with WebClient403 禁止使用 WebClient
【发布时间】:2020-05-11 00:51:39
【问题描述】:

我工作的公司的互联网连接有限,我们使用代理(例如:10.10.10.10:8080)访问一些受限连接。

我可以在 Postman 中使用 API(将代理放在 Postman 设置中),但是在放入 C# WebClient 代码时,它给了我一个 403-Forbidden 错误。

我只需要var sensorData 字段,但我分成var datavar data2 来了解问题出在哪里。它给了我var data = ...的错误

Uri uri = new Uri("https://XXXXXXXX/api/DatasourceData/DatasourceDataHistoryBySerialNumber/");
Token token = new Token();
token = GetToken(tokenAPI);

using (WebClient client = new WebClient())
{
  try
  {
    client.Proxy = new WebProxy("10.10.10.10", 8080);
    client.Headers.Add("Authorization", "Bearer " + token.AccessToken);
    client.QueryString.Add("serialNumbersDatasource", "I2001258");
    client.QueryString.Add("startDate", string.Format("{0:s}", "2019-12-01"));
    client.QueryString.Add("endDate", string.Format("{0:s}", DateTime.Now));
    client.QueryString.Add("isFilterDatesByDataDate", "false");

    var data = client.DownloadData(uri);
    var data2 = (Encoding.UTF8.GetString(data));

    sensorData = (JsonConvert.DeserializeObject<List<Sensor>>(Encoding.UTF8.GetString(client.DownloadData(uri))))[0];
  }
}

【问题讨论】:

    标签: c# webclient


    【解决方案1】:

    这行好像有问题

    client.Headers.Add("Authorization", "Bearer " + "tokenTest");
    

    在这里你将添加标题Authorization 和值Bearer tokenTest

    所以,403 Forbidden return by service that you are address, but not a proxy

    改成

    client.Headers.Add("Authorization", "Bearer " + tokenTest);
    

    并检查tokenTest 是否具有有效值

    【讨论】:

    • 这就是我所拥有的,为了更好地理解我正在传递一个字符串,我进行了更改。我将代码编辑为与我所拥有的相似
    【解决方案2】:

    检查您是否需要代理上的任何其他属性。您可能需要启用:

    UseDefaultCredentials (Boolean) 如果默认凭据是,则为 true 用过的;否则为假。默认值为假

    此外,请检查您正在生成的完整 url 和查询字符串 - 查看制造的传出请求(在调试器中)或通过 Fiddler 并确保它们全部对齐,url、查询字符串、标题等。

    From the docs

    地址 获取或设置代理服务器的地址。

    绕过数组列表 获取不使用代理服务器的地址列表。

    绕过列表
    获取或设置不使用代理服务器的地址数组。

    BypassProxyOnLocal
    获取或设置一个值,该值指示是否绕过本地地址的代理服务器。

    凭据 获取或设置要提交给代理服务器进行身份验证的凭据。

    使用默认凭据
    获取或设置一个布尔值,该值控制 DefaultCredentials 是否随请求一起发送。

    【讨论】:

    【解决方案3】:

    可能是授权标头有问题。 令牌有效吗?是否可以在 Postman 中使用相同的令牌?

    我敢打赌,api 无法验证令牌,并且不会授予您对资源的授权。这就是 403 的含义(但不知道 api 程序员给你 403 的实际意图)。

    您可以访问 api 的源代码吗?

    令牌实际上是一个字符串“tokentest”并且可以与 Postman 一起使用?

    【讨论】:

    • 不,“tokentest”只是一个例子。我已经编辑为与我所拥有的相似
    • 你有没有在没有代理的情况下尝试过,这样你就知道问题出在api还是代理服务器了?
    • 我现在试过了,似乎没有代理它也不起作用。这很奇怪,因为它在 Postman 中工作
    • 用httpclient类试试
    【解决方案4】:

    我建议您使用 xNet.dll 而不是 webclient,因为 xNet 库被认为最适合代理和 webrequest。

    var request = new HttpRequest()
    request.UserAgent = Http.ChromeUserAgent();
    request.Proxy = Socks5ProxyClient.Parse("10.10.10.10:8080");//can use socks4/5 http
    

    【讨论】:

      【解决方案5】:

      基于this

      尝试在标题中添加User-Agent

      client.Headers.Add("User-Agent", "PostmanRuntime/7.26.1");
      

      【讨论】:

        【解决方案6】:

        就我而言,我没有指定安全协议。在运行任何 WebClient 请求之前粘贴这行代码。

        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
        

        原答案:How to specify SSL protocol to use for WebClient class

        【讨论】:

          猜你喜欢
          • 2011-03-17
          • 1970-01-01
          • 2013-11-28
          • 1970-01-01
          • 2013-11-12
          • 1970-01-01
          • 1970-01-01
          • 2021-09-23
          • 2017-02-24
          相关资源
          最近更新 更多