.NET 中的 HttpResponseMessage returns 403

HttpResponseMessage returns 403 in .NET

我有一个 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 我想让它在上面工作。 如有任何建议,我们将不胜感激。

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

的全局实例

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

因此,如果您像这样稍微重写代码:

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);
        }
    }

应该没问题。