.net core 5 AddHeaderPropogation 不转发 RequestHeaders

Posted

技术标签:

【中文标题】.net core 5 AddHeaderPropogation 不转发 RequestHeaders【英文标题】:.net core 5 AddHeaderPropogation not forwarding RequestHeaders 【发布时间】:2021-05-21 21:10:51 【问题描述】:

在 C# Web Api 中,我尝试将 100% 的所有标头和参数转发到 HTTP 请求中。解决方案中有多种预先存在的请求格式。可能有 60 种不同的 API 类型,每种都有不同的结构。我不知道每种请求类型的标头内容。但是,希望这对问题无关紧要。 首先,我验证入站请求的授权标头。如果它有效,我想将所有标头以及查询字符串“按原样”传递给最终端点。最终端点位于 php/Laravel 服务器中,计划有选择地将每个端点移动到 C# 服务器。 我会提到这一点,以防你问:“你为什么要这样做?”

未知标头的“前向传播”问题似乎在微软有解决方案

 services.AddHttpClient("ApiUserCheckSkills").AddHeaderPropagation(); on Factory generated Clients
 app.UseHeaderPropagation(); 
 // Both activated in Startup.cs

根据我所阅读的 .AddHeaderPropagation(),没有参数,将默认将每个 Header 项目(未经修改和匿名)传播到下一个请求中。完美的!但这对我不起作用。

在将接受并转发初始请求的控制器内部:

```
    public UserAuthGateway(IHttpClientFactory factory)
    
        _factory = factory;
    
    
    [Route("api/user/check/skills")]
    [HttpGet]
    public async Task<IActionResult> ApiUserCheckSkills([FromQuery] string queryString)
    

        //
        //  This call require an Authenticated User identified by a Bearer Token as well as an expires_in integer format seconds 
        //             
        string validationResult = Methods.JWS.JWS_ValidateAsymmetricAsGate(Request.Headers, Keys.publicXmlKey);
        if (!(validationResult == "BearerTokenValid"))
        
            return StatusCode(401, validationResult);  // Some Problem with Authorization
                    
        // Assuming the auth token was valid, here is the forwarding code
         var request ="https://xxx.xxxxx.systems/api/user/check/skills" + Request.QueryString;
        var client = _factory.CreateClient("ApiUserCheckSkills");
        var response = await client.GetAsync(request, 0 );
        
        if (response.IsSuccessStatusCode)
        
            var ret = await response.Content.ReadAsStringAsync();               
            return Ok();
        
        else
        
            return StatusCode(500, "Something Went Wrong! Error Occured");
        
       


     
var client = _factory.CreateClient("ApiUserCheckSkills"); 

没有标题。因此,对最终端点的调用失败。呼叫即将到达最终终点。但它失败了,因为现在缺少对要在 Authorization 标头中传播的 Bearer 令牌的验证。它没有被传播。 Google 上有很多 HeaderPropagation 的例子。使用带参数的 AddHeaderPropagation() 的能力通常通过特定的标头来演示,但没有传播所有匿名标头的示例。

【问题讨论】:

你解决了吗?我有同样的问题,没有找到让它工作的方法。 我还没有修复它。 2020 年 7 月 26 日 我可以用当前的答案修复它,它现在对我有用 【参考方案1】:

您必须指定要传播的所有标头。在这里你可以找到更多samples。

public void ConfigureServices(IServiceCollection services)

   // Define all headers you would like to propogate
   services.AddHeaderPropagation(options => options.Headers.Add("sample-header"));

   services
      .AddHttpClient("externalapi-client", options => options.BaseAddress = new Uri("https://localhost:5001"))
      // Define DelegatingHandler which handles before sending request to external Api
      .AddHeaderPropagation();

   services.AddControllers();

【讨论】:

为什么AddHeaderPropagation 第二次添加到代码中?第一个电话不应该工作吗?

以上是关于.net core 5 AddHeaderPropogation 不转发 RequestHeaders的主要内容,如果未能解决你的问题,请参考以下文章

.NET 4.5.1 与 .NET Core 5

如何在 .NET Core 3.0 SDK 上构建多目标 .NET 5 和 .NET Core 3.1

.NET 4.5.x 和 .NET Core 有啥区别? [关闭]

如何按照存储库模式在 Asp.Net Core 5.0 项目上实现 .Net Core Identity?

.Net Core 身份在 .Net Core 5.0 中添加公司名称作为用户登录过程的一部分

.NET平台系列5 .NET Core 简介