如何使用 .NET HttpClient 连接到我的 Notion API 集成?我可以使用 Postman 连接,但不能使用我的应用程序

问题描述 投票:0回答:1

我可以通过来自 text 的调用,使用 Postman 连接到我的 Notion 页面。我正在使用我的内部集成。我添加了授权和概念版本标头。我的程序是 Blazor 服务器应用程序,正在使用 Visual Studio。我对尝试 Python 或 JavaScript 不感兴趣。这需要是 Blazor 服务器。

当我使用代码时,出现授权错误 (401)。 else 子句执行。你能帮忙吗?

private async Task GetDatabaseContent()
{
    string requestUri = $"https://api.notion.com/v1/pages/{pageId}";

    client.DefaultRequestHeaders.Add(name: "Authorization", value: $"Bearer {bearerToken}");
    client.DefaultRequestHeaders.Add(name: "Notion-Version", value: "2022-06-28");

    HttpResponseMessage response = new HttpResponseMessage();

    try
    {
        response = await httpClient.GetAsync(requestUri);
    }
    catch (Exception ex)
    {
        responseMessage = $"Exception: {ex}";
    }

    if (response.IsSuccessStatusCode)
    {
        responseMessage = "Success: " + await response.Content.ReadAsStringAsync();
    }
    else
    {
        responseMessage = $"Error: {response.Content}";
        reasonPhrase = $"Error: {response.ReasonPhrase}";
    }

我浏览了 YouTube 上的无数示例,还查看了 Pluralsight 和 Skillshare。

c# blazor-server-side dotnet-httpclient notion-api
1个回答
0
投票

正如评论中...

您有 2 个

HttpClient
实例,并且正在一个实例上设置标头,包括授权标头 -
client
- 但使用另一个实例发送请求 -
httpClient

每个实例都有自己的

DefaultRequestHeaders
集合,因此您需要在用于发送请求的同一实例上设置标头。


请注意,通常更好的做法是在新的

HttpRequestMessage
中为每个请求设置(大多数)标头,然后将其与
.SendAsync()
一起使用,而不是例如
.GetAsync()

除非您有一个非常简单的单线程应用程序,否则对于

HttpClient.DefaultRequestHeaders
的生命周期内的每个请求,
HttpClient
应该只具有始终相同的标头,并且
HttpClient
 的生命周期通常会反过来成为您应用程序的生命周期
授权标头通常可以在应用程序的生命周期内更改(因为它过期并更新),并且

DefaultRequestHeaders

不是线程安全的

在此属性上设置的标头不需要在请求消息上再次设置。
当有未完成的请求时,不应修改 DefaultRequestHeaders

它比这暗示的还要脆弱,并且同时从多个线程更改
DefaultRequestHeaders

可能会出现问题,因为它的底层(通常)只是一个数组,在不考虑线程安全的情况下进行操作。因此,在任何有意义的多线程应用程序中,每当您设置

DefaultRequestHeaders
值时,您都会创建竞争条件。
    

© www.soinside.com 2019 - 2024. All rights reserved.