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

时间:2018-11-04 20:05:08

标签: c#

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

这是我的Azure Function应用代码:

[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);
}

Results View

从此键/值列表中,我想获得名为apikeydomainName的键,并且我尝试了各种奇怪的方法:

 headers.ToList()[0]

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

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

List

我已经看到了很多关于使用foreach循环的示例,但是就我而言,我以为我可以使用lambda来提取值,因为我期望两个非常具体的键名。我知道这很容易实现,但是我对如何进行感到迷茫。

2 个答案:

答案 0 :(得分:1)

一次获得一项的一个选项是使用FirstOrDefult(),它返回列表中与表达式匹配的第一个元素。如果不存在任何元素,则将返回null

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

同时获取两个键

var yourKeys = new List<string>{"apikey", "domainName"};
headers.Where(x => yourKeys.Contains(x.Key)).ToList();

答案 1 :(得分:1)

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,因此,由于没有异常开销,因此执行TryGetValues会更快。

HttpRequestHeaders在内部类似于Dictionary<string, List<string>,因此首选字典查找方式。