从 C# 中的键/值集合中读取特定的 HTTP 标头值

Jas*_*SFT 3 c#

我正在尝试从 HTTP 方法中读取两个标头值,但我的 C# 知识存在一些空白。Results View调试时我可以在本地人中看到 a ,我也可以看到它是 aSystem.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);
}
Run Code Online (Sandbox Code Playgroud)

结果视图

从这个键/值列表中,我想命名键apikeydomainName并且我尝试了各种奇怪的方法来做到这一点:

 headers.ToList()[0]
Run Code Online (Sandbox Code Playgroud)

或者

var key = headers.Where(x => x.Key == "apikey")
Run Code Online (Sandbox Code Playgroud)

鉴于第二个例子,key最终成为另一个列表:

列表

我已经看到了很多关于使用 foreach 循环的例子,但就我而言,我认为我可以使用 lambda 来提取值,因为我期待两个非常具体的键名。我意识到这很容易获得,但我不知道如何进行。

Sco*_*ain 7

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);
}
Run Code Online (Sandbox Code Playgroud)

还有一个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);
}
Run Code Online (Sandbox Code Playgroud)

但是,如果标头未与请求一起发送,GetValues则会抛出InvalidOperationException一个TryGetValues由于没有异常开销会更快。

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