StringValues.Contains() всегда возвращает false

Я пытаюсь проверить, содержит ли заголовок Accept тип MIME, например:

public static bool AcceptsView(this HttpRequest request) => request.Headers.Accept.Contains("text/html");

Однако даже если заголовок Accept равен Accept: text/html, text/plain, application/json, он возвращает false. Что я делаю не так?

Вы отлаживали и видели, что такое Accept на самом деле? Полагаю, это коллекция из одного элемента с "Accept: text/html, text/plain, application/json". Однако ваш код проверяет коллекцию из трех элементов со значениями "text/html", "text/plain" и "application/json".

MakePeaceGreatAgain 17.07.2024 13:03

Это список, а не строка. Попробуйте сделать...Accept.Contains(new MediaTypeWithQualityHeaderValue("text/html"))

D A 17.07.2024 13:03

@MakePeaceGreatAgain Да, я отладил, и значение равно "text/html, text/plain, application/json", поэтому я в замешательстве. Разве это не должен быть массив значений, содержащий типы MIME?

iKingNinja 17.07.2024 13:16

@DA Я получаю эту ошибку: «CS1929 'StringValues' не содержит определения для 'Contains' и лучшая перегрузка метода расширения 'MemoryExtensions.Contains<MediaTypeWithQualityHeaderValue>(‌​ReadOnlySpan<MediaTy‌​peWithQualityHeaderV‌​alue>, MediaTypeWithQualityHeaderValue)' требует получатель типа «System.ReadOnlySpan<System.Net.Http.Headers.MediaTypeWithQu‌​alityHeaderValue>»

iKingNinja 17.07.2024 13:18

Я думаю, что это массив, однако отладчик показывает его строковое представление, то есть "Accept: text/html, text/plain, application/json". В любом случае, вам просто нужно использовать request.Headers.Accept.Any(x => x.ToString() == "text/html");

MakePeaceGreatAgain 17.07.2024 13:33

Я это уже пробовал, разницы нет

iKingNinja 17.07.2024 13:37

О каком HttpRequest классе речь? Один внутри System.Web, другой внутри Microsoft.AspNetCore.Http пространства имен и т. д.

Peter Csala 17.07.2024 15:06
Microsoft.AspNetCore.Http, ControllerBase.Request
iKingNinja 17.07.2024 15:25
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
104
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Microsoft.AspNetCore.Http.HttpRequest определяет свойство Headers , которое представляет собой IHeaderDictionary . Этот интерфейс определяет свойство Accept, которое является StringValues ​​. По сути, этот тип представляет собой коллекцию строк, реализующую множество интерфейсов, например IEnumerable<string>.

Всякий раз, когда вы вызываете Contains на Accept, который проверяет, присутствует ли предоставленная строка в коллекции. В вашем случае это свойство содержит один элемент. Ни одного элемента для каждого допустимого типа MIME.

Итак, у вас есть коллекция с одним элементом text/html, text/plain, application/json и вы проверяете, есть ли в ней элемент с text/html. Вот почему он всегда возвращает false.

Опция 1

Итак, вам следует проверить, есть ли в коллекции StringValues какой-либо элемент, содержащий указанную строку:

request.Headers.Accept.Any(x => x.Contains("text/html"))

Вариант 2

Другой способ выполнить эту проверку — использовать GetTypedHeaders . Это вернет экземпляр RequestHeaders . Его свойство Accept — это не StringValues, а IList<MediaTypeHeaderValue>. Итак, здесь у вас есть один MediaTypeHeaderValue на каждый допустимый тип пантомимы.

MediaTypeHeaderValue имеет свойство MediaType . Его тип — StringSegment, у которого есть свойство Value.

request.GetTypedHeaders().Accept.Any(x => x.MediaType.Value == "text/html")

Вы также можете избежать жесткого кодирования text/html. Пространства имен System.Net.Mime определяют несколько классов, таких как MediaTypeNames или MediaTypeNames.Text . Последний имеет константу Html, которая содержит text/html

request.GetTypedHeaders().Accept.Any(x => x.MediaType == MediaTypeNames.Text.Html)

Другие вопросы по теме

Есть ли способ запустить метод при загрузке сайта, но не при его отправке сообщений (asp.net + vb.net)
Как удалить строки datatable1, имеющие другой идентификатор, при сравнении с datatable2
.NET 8 преобразует прописное турецкое «I» в строчное «i» вместо «ı»
Раскрывающиеся списки навигации на страницах ASP.NET Core 8.0 Razor. Как предотвратить открытие новых страниц?
Невозможно добавить в БД несколько одинаковых объектов, сохраняются только разные. .NET EntityFramework
Автоматическое развертывание приложения dotnet в Elastic Beanstalk не выполняется как в CodePipeline, так и в действиях GitHub, но работает вручную
Проблема с ответом API
Подход внедрения зависимостей для объекта, используемого только в одном методе
Можете ли вы проверить, действительно ли функция работает асинхронно?
Azure «azd up» удаляет личный домен из развернутого приложения Containerapp. Как я могу это сохранить?