【问题标题】:HttpResponseMessage returns 403 in .NETHttpResponseMessage 在 .NET 中返回 403
【发布时间】:2023-03-08 14:21:01
【问题描述】:

我有一个async 方法,它在.Net 中反复调用HttpClient。我在下面将我的代码模拟为一个小型控制台应用程序:

    private static HttpClient req { get; set; } = new HttpClient();

    static async Task Main(string[] args)
    {
        Console.WriteLine("Please press enter to start healthCheck");
        Console.ReadLine();

        healthCheck();

        Console.ReadLine();
    }

    private static async Task healthCheck()
    {
        while (true)
        {
            req.DefaultRequestHeaders.Add("apikey", "myPassword");

            string strUrl = "http://myUrl";

            HttpResponseMessage hrm = await req.GetAsync(strUrl);

            Console.WriteLine("=> statusCode:" + (int)hrm.StatusCode);

            await Task.Delay(5000);
        }
    }

输出是:

问题是当我使用Postman 或使用python 编写此代码时,每次它都响应200 而不是403

import requests as req
import time as t

url = "http://adpsms.adpdigital.com/report/?date=2021-08-30"
customHeader = {"apikey": "sssrjdIiGisbViKA"}

i = 10

while (i > 0):
    response = req.get(url, headers = customHeader)

    print("statusCode: " + str(response.status_code))

    i -= 1
    t.sleep(5)

我以为这是服务器错误,但当我每次都用 python 回复 200 时,我知道这可能是我的代码或基于客户端的东西有问题。

由于我的项目基于.NET,我想让它在上面运行。 任何建议将不胜感激。

【问题讨论】:

  • 在创建 HttpClient 时尝试只添加一次 DefaultRequestHeader。您无需在循环的每次迭代中添加它们。

标签: python c# async-await httpresponse dotnet-httpclient


【解决方案1】:

在循环的每次迭代中,您都添加了 DefaultRequestHeaders。 这意味着它们将在您循环的每次迭代中一次又一次地添加到 HttpClient 的全局实例中

根据the official docs,这些标头将随每个请求一起发送。 对于您的特定任务,您可能只添加一次(这就是名称包含前缀 default 的原因。)

所以如果你像这样稍微重写你的代码:

private static HttpClient req { get; set; } = new HttpClient();

    static async Task Main(string[] args)
    {
        Console.WriteLine("Please press enter to start healthCheck");
        Console.ReadLine();
        AddDefaultHeaders();
        healthCheck();
    
        Console.ReadLine();
    }
    
    private static void AddDefaultHeaders()
    {
        req.DefaultRequestHeaders.Add("apiKey", "myPassword");
    }

    private static async Task healthCheck()
    {
        while (true)
        {
            string strUrl = "http://myUrl";
    
            HttpResponseMessage hrm = await req.GetAsync(strUrl);
    
            Console.WriteLine("=> statusCode:" + (int)hrm.StatusCode);
    
            await Task.Delay(5000);
        }
    }

它应该可以正常工作。

【讨论】:

  • 非常感谢!不幸的是,我没有注意到这一点。你帮了我很多,我被困了好几个小时!祝你好运。
  • @dev.amirali,不客气!祝你有美好的一天,少一些错误)
猜你喜欢
  • 1970-01-01
  • 2020-01-13
  • 1970-01-01
  • 2016-07-02
  • 1970-01-01
  • 2019-01-11
  • 2019-06-05
  • 2015-02-21
  • 2016-05-20
相关资源
最近更新 更多