我正在为一个新闻聚合器Web应用程序创建一个原型,现在我正在为它创建后端,在那里它处理来自https://newsapi.org/个端点

在Swagger UI中,我收到了我定义的这个错误

enter image description here

调试器显示响应是400 Bad Request,当我获取用于该请求的确切URL并将其粘贴到我的浏览器/postman 中时,这完全是假的,这起作用了,实际上也让我的swagger API也起作用了:

这是await response.Content.ReadAsStringAsync()的内容

"{\"status\":\"error\",\"code\":\"userAgentMissing\",\"message\":
\"Please set your User-Agent header to identify your application. Anonymous requests are not allowed.\"}"

enter image description here

突然我的Swagger用户界面开始工作,并返回相同的响应,我注意到这是持久的,这意味着停止和启动我的WebApi将保留对我使用的端点的"激活",但如果我将参数从us更改为ua,则不会

这就是我从NewSapi访问终端的方式

 public async Task<NewsApiResponse> GetNewsAsync(string country, string category)
 {
     string url = $"https://newsapi.org/v2/top-headlines?country={country}&category={category}&apiKey={_apiKey}";

     var response = await _httpClient.GetAsync(url);
     response.EnsureSuccessStatusCode();

     var content = await response.Content.ReadAsStringAsync();
     var newsData = JsonConvert.DeserializeObject<NewsApiResponse>(content);

     // Check if the response status is 'error'
     if (newsData.Status == "error")
     {
         throw new HttpRequestException($"Error from News API: {newsData.ErrorMessage}");
     }

     return newsData;
 }

这是我在自己的后端上的端点.

[HttpGet("GetNews")]
public async Task<IActionResult> GetNews([FromQuery] string country, [FromQuery] string category)
{
    try
    {
        var news = await _newsService.GetNewsAsync(country, category);
        return Ok(news);
    }
    catch (Exception ex)
    {
        return StatusCode(500, "An error occurred while processing your request");
    }
}

一开始我认为这是一个竞争条件问题,因为我使用调试器并复制url粘贴到浏览器中进行测试,然后再进一步进行测试,但这显然是误导.这是SwaggerUI和newsapi的典型行为吗?

推荐答案

400 Bad Request可能有很多不同的原因,因此很难进行调试.幸运的是,NewsAPI在他们的响应中提供了更详细的错误描述.引述自their documentation

Error codes

当返回一个HTTP错误时,我们在包含更多信息的响应中填充代码和消息属性

因此,通过查看await response.Content.ReadAsStringAsync()的内容,您将更接近根本原因.

用户代理未命中

请设置您的用户代理标头以标识您的应用程序.不允许匿名请求.

有了这些信息,您就可以知道要做什么:您需要在HttpRequest中为User-Agent头设置一个值.此标头在RFC 9110中描述,通常包含有关调用者的信息.如果您通过浏览器发送请求,它将自动设置.但在SwaggerUI中,情况似乎并非如此.

您可以按如下方式设置用户代理标头:

httpClient.DefaultRequestHeaders.Add("User-Agent", "My C# App");

Csharp相关问答推荐

react 式扩展连接中的非交叉LeftDurationTimeout

有没有一种方法可以在包含混合文本的标签中嵌入超链接?

使用特定格式的JsonConvert序列化对象

. NET Core DB vs JSON模型设计

有没有办法使.NET 6应用程序在特定的.NET 6运行时版本上运行

mocking对象的引发事件并作为用于调用方法的参数对象传递到那里

从ASP.NET Core中的枚举字段填充 Select 选项时,将默认的第一个选项添加为 Select 元素

我想在文本框悬停时在其底部显示一条线

每个http请求需要60秒,为什么?

使用Dapper映射联接查询对象数据到使用SplitOn;

有空容错运算符的对立面吗?

如何将DotNet Watch与发布配置和传递给应用程序的参数一起使用?

在C#.NET项目中启动时,如何等待提升的PowerShell进程退出?

为什么Azure函数(独立工作进程)索引失败?使用Azure App配置的CosmosDbTrigger绑定失败,未解析为值

为什么ReadOnlySpan;T&>没有Slice(...)的重载接受Range实例的?

从Base64转换为不同的字符串返回相同的结果

用于ASP.NET核心的最小扩展坞

如何阻止可传递依赖项出现在项目中

分别切换用于读取和写入的EF核心日志(log)

阻止CLR释放已封送的双字符指针的内存?