ASP.Net Core 2.0 Как получить все заголовки запросов в промежуточном программном обеспечении?

В ASP.Net Core 2.0 я пытаюсь проверить заголовки входящих запросов в пользовательском промежуточном программном обеспечении.

Проблема в том, что я не знаю, как извлечь все заголовки пар ключ-значение. Заголовки, которые мне нужны, хранятся в защищенном свойстве

protected Dictionary<string, stringValues> MaybeUnknown

Мой класс промежуточного программного обеспечения пока выглядит так:

public class HeaderValidation
{
    private readonly RequestDelegate _next;
    public HeaderValidation(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext httpContext)
    {
        IHeaderDictionary headers = httpContext.Request.Headers; // at runtime headers are of type FrameRequestHeaders

        // How to get the key-value-pair headers?
        // "protected Dictionary<string, stringValues> MaybeUnknown" from headers is inaccessbile due to its protection level
        // Casting headers as Dictionary<string, StringValues> results in null

        await _next.Invoke(httpContext);
    }
}

Моя цель — извлечь все заголовки запроса, а не только несколько выбранных заголовков, для которых я должен знать конкретные ключи.


person philipp-fx    schedule 15.03.2018    source источник
comment
IHeaderDictionary реализует IDictionary, вы должны иметь возможность использовать все обычные API-интерфейсы IDictionary.   -  person Tratcher    schedule 15.03.2018
comment
Возможный дубликат https://stackoverflow.com/questions/38794749/how-to-extract-custom-header-value-in-web-api-message-handler-in-net-core   -  person Set    schedule 16.03.2018
comment
Спасибо всем за отличный вклад! Думаю, я недостаточно ясно выразился в своем вопросе и немного перефразировал его. Акцент делается на все заголовки, а не только на несколько избранных, для которых я должен знать ключи.   -  person philipp-fx    schedule 16.03.2018
comment
Благодаря вкладу каждого я смог получить то, что хотел. Чтобы получить все заголовки, мне нужно было создать новую строку Dictionary‹string, StringValues›, которая принимает IHeaderDictionary в качестве входных данных, вот так: var headerDictionary = new Dictionary<string, StringValues>(headers)   -  person philipp-fx    schedule 16.03.2018
comment
@philipp-fx - вы должны ответить на свой вопрос здесь и принять ответ. Этот трюк действительно полезен и, безусловно, не дублирует тот другой вопрос :( - жаль, что ответ путается среди комментариев.   -  person Steve    schedule 07.03.2019


Ответы (1)


httpContext.Request.Headers это Dictionary. Вы можете вернуть значение заголовка, передав имя заголовка в качестве ключа:

context.Request.Headers["Connection"].ToString()
person Marc LaFleur    schedule 15.03.2018
comment
Спасибо за ответ Марк! Теперь я знаю, как извлекать заголовки, для которых я знаю ключи. Это уже полезно, потому что я вообще не знал, как извлечь какой-либо заголовок пары ключ-значение. Тем не менее, моя цель — извлечь все заголовки, и я бы хотел избежать необходимости знать все ключи. - person philipp-fx; 16.03.2018
comment
Я смог получить то, что хотел, создав новый словарь, который принимает переменную headers в качестве входных данных. Спасибо! - person philipp-fx; 16.03.2018