【问题标题】:cant set Authorization Header in HttpClient ( .Net core 3.1 )无法在 HttpClient 中设置授权标头(.Net core 3.1)
【发布时间】:2020-01-30 12:20:22
【问题描述】:

我正在从 .net core 2.2 迁移到 3.1。我正在制作一个 XUnit 测试方法来测试我的控制器。 我在 .net core 2.2 项目中成功制作和测试,但在迁移到 3.1 后,它似乎无法为我的请求设置授权标头,所以我从我的应用程序中获得了 UnAuthorized。

这是我的代码:

    [Fact]
    public async void InvalidId_UnSuccessFull_GetById()
    {
        // Arrange
        var httpClient = new HttpClient();
        var token = await GetAdminAccessToken(); // Sends a login request and fetch a valid token
       // httpClient.DefaultRequestHeaders.Add("Authorization",$"Bearer {token}");
        httpClient.DefaultRequestHeaders.Authorization=new AuthenticationHeaderValue("Authorization",$"Bearer {token}");
        var id = Guid.Empty;

        // Act
        var response = await httpClient.GetAsync("localhost:5000/Admin/User/{id}");
        var message = await ExtractMessage(response);


        // Assert
        Assert.Contains(PersianErrorMessage.InvalidUserId, message);
        Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode);
    }

我调试到 httpClient 类,直到 sendAsync 方法和 HttpRequestMessage 请求实例没有我上面设置的授权标头!我的代码有什么问题?

【问题讨论】:

    标签: httpclient .net-core-3.1


    【解决方案1】:

    AuthenticationHeaderValue 应该这样设置:

    httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
    

    来源:https://docs.microsoft.com/en-us/dotnet/api/system.net.http.headers.authenticationheadervalue.-ctor?view=netcore-3.1#System_Net_Http_Headers_AuthenticationHeaderValue__ctor_System_String_

    【讨论】:

      【解决方案2】:

      有几个问题可能会让您陷入困境。这可能是一个令人沮丧的问题,所以希望这会有所帮助。 HTTP 客户端很可能会发送 Authorization 标头。如果有任何类型的重定向,Authorization 标头不会随它一起移动。我曾经遇到过这个问题,唯一的问题是我的原始 URL 没有末尾的斜杠

      我输入的内容: https://api.example.com/v3/endpoint

      服务器端点: https://api.example.com/v3/endpoint/

      • 第一步,判断是否有重定向。
      • 第 2 步,使您的 URL 与最终 URI完全匹配

      像 curl 这样的客户端会自动执行此操作。在 .Net 3.1 中,您必须确保您的客户端检查重定向。 401 错误实际上是一件好事——这意味着您很可能到达了正确的端点,尽管没有授权令牌。

      您可以在代码中执行此操作,但只需在收到响应后运行调试并中断即可。检查 HttpResponseMessage (response.RequestMessage.RequestURI) 的 RequestMessage 对象的 RequestURI 属性。将此与您的初始 URL 进行比较。如果它们不完全匹配,则您已被重定向并且授权标头在此过程中丢失。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-15
        • 2023-04-01
        • 1970-01-01
        相关资源
        最近更新 更多