Skip to main content
 首页 » 编程设计

c#之从 C# 中的键/值集合中读取特定的 HTTP header 值

2024年02月25日36softidea

我正在尝试从一个 HTTP 方法中读取两个 header 值,但我的 C# 知识还有些不足。调试时,我可以在本地看到一个 Results View,我也可以看到它是一个 System.Collections.Generic 但我不知道如何访问此列表以获取我的两个值。

这是我的 Azure Function App 代码:

[FunctionName("Tenant")] 
public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "Tenant/{DomainName}")]HttpRequestMessage req, string DomainName, [Inject(typeof(ITableOps))]ITableOps _tableOps, TraceWriter log) 
{ 
    var headers = req.Headers; 
    var settings = _tableOps.GetTenantSettingsAsync(DomainName); 
    return req.CreateResponse(HttpStatusCode.OK, settings.Result); 
} 

从这个键/值列表中,我想获得名为 apikey 和 domainName 的键,我已经尝试了各种奇怪的方法来做到这一点:

 headers.ToList()[0] 

或

var key = headers.Where(x => x.Key == "apikey") 

在第二个示例中,key 最终成为另一个列表:

我看过很多关于使用 foreach 循环的示例,但在我的例子中,我认为我可以使用 lambda 来提取值,因为我需要两个非常具体的键名。我意识到这很容易获得,但我不知道如何继续。

请您参考如下方法:

Headers是 HttpRequestHeaders类,该类有一个 TryGetValues 适用于这种确切情况的函数。

[FunctionName("Tenant")] 
public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "Tenant/{DomainName}")]HttpRequestMessage req, string DomainName, [Inject(typeof(ITableOps))]ITableOps _tableOps, TraceWriter log) 
{ 
    var headers = req.Headers; 
    if(!headers.TryGetValues("apiKey", out var apiKeys) || 
       !headers.TryGetValues("domain", out var domains)) 
    { 
        return req.CreateResponse(HttpStatusCode.Forbidden); 
    } 
    var apiKey = apiKeys.First(); 
    var domain = domains.First(); 
 
    //Do something with apiKey and domain here. 
 
    var settings = _tableOps.GetTenantSettingsAsync(DomainName); 
    return req.CreateResponse(HttpStatusCode.OK, settings.Result); 
} 

还有一个GetValues可以像这样使用的函数

[FunctionName("Tenant")] 
public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "Tenant/{DomainName}")]HttpRequestMessage req, string DomainName, [Inject(typeof(ITableOps))]ITableOps _tableOps, TraceWriter log) 
{ 
    var headers = req.Headers; 
    var apiKey = headers.GetValues("apiKey").First(); 
    var domain = headers.GetValues("domain").First(); 
 
    //Do something with apiKey and domain here. 
 
    var settings = _tableOps.GetTenantSettingsAsync(DomainName); 
    return req.CreateResponse(HttpStatusCode.OK, settings.Result); 
} 

但是GetValues会抛出 InvalidOperationException如果 header 未随请求一起发送,那么执行 TryGetValues由于没有异常开销,会更快。

HttpRequestHeaders有点像 Dictionary<string, List<string>在内部,字典查找将是首选的方式。