Что такое код asp querystring


Использование функции ParseQueryString для получения значений из QueryString

Мне нужно было получить значения из строки в формате QueryString, например: data1 = value1 & data2 = value2.

Кто-то предположил, что я использовал HttpUtility.ParseQueryString, чтобы получить значение, я искал и искал, но я не могу найти какую-либо документацию или ее реализацию, а документация Microsoft для нее не объясняет, как это работает, может кто-то сказать мне hwat я «Я делаю неправильно, мой код ниже;

2 ответа

A NameValueCollection представляет собой набор связанных ключей String и String, к которым можно получить доступ либо с ключом, либо с индексом.

Я нашел проблему, я ссылался на все хорошо, но я делал это в отдельном файле зависимостей.VB, как только я сделал это на фактическом коде, стоящем за формой aspx, которая решила проблему, и все это сработало. Итак, теперь я просто передаю строку из Codebehind как специализированную коллекциюNameValue для функции.

ASP QueryString Коллекция

Коллекция QueryString используется для получения значений переменных в строке HTTP запроса.

Строка HTTP запроса задается значениями после знака вопроса (?) , Как это:

Выше строка создает переменную с именем TXT со значением «это тест строки запроса».

Строки запросов также создаются путем подачи формы, или пользователем, введя запрос в адресную строку браузера.

Note: Если вы хотите , чтобы передавать большие объемы данных (beyond 100 kb) Request.QueryString не может быть использован.

Синтаксис

параметр Описание
variable Необходимые. Имя переменной в строке HTTP запроса, чтобы получить
index Необязательный. Определяет один из нескольких значений для переменной. С 1 по запросу. QueryString(variable) .Count

Примеры

Пример 1

Для перебора всех значений переменных в п Строка запроса:

Следующий запрос посылается:

и names.asp содержит следующий скрипт:

Файл names.asp будет отображаться следующее:

Пример 2

Следующая строка может быть отправлена:

это приводит к следующему значению QUERY_STRING:

Теперь мы можем использовать эту информацию в скрипте:

Если вы не зададите значения переменных для отображения, например:

результат будет выглядеть следующим образом:

Коллекция ASP QueryString

QueryString коллекции используется для получения значения переменной в строке HTTP запроса.


Строка HTTP запроса задается значением после знака вопроса, например, (?):

Приведенный выше код создает файл с именем TXT со значением «это тест строки запроса» переменной.

Строки запросов также генерируются путем отправки формы, либо пользователь вводит запрос в адресной строке браузера.

Примечание: Если вам нужно размещать большие объемы данных (более 100 Кб), вы не можете использовать Request.QueryString.

грамматика

参数 描述
variable 必需。在 HTTP 查询字符串中要取回的变量名称。
index 可选。为一个变量规定多个值之一。从 1 到 Request.QueryString(variable).Count。

примеров

Пример 1

строковые значения Traversal запросов всех переменных п:

Мы предположили, что этот запрос посылается:

Names.asp содержит следующий код:

Файл names.asp покажет:

Пример 2

Предположим, что строка посылается:

Приведенный выше код дает следующее значение QUERY_STRING:

Теперь мы можем использовать эту информацию в сценарии:

Если не указать значения переменных, которые будут отображаться, например, следующим образом:

request.querystring

how can i use request.querystring in asp.net.i have a linkbutton and this is in a repeater control.i want to play video for the corresponding link _click.i want to pass a fileID of the corresponding link to a function,how can i do this ?

2 Answers 2

This won’t help you:

as it will not put FileName into query stirng. Rather use this method:

If you plan to use query string, the button click can do either of the following:

  1. Hyperlinks to a page with the designated quertstring to identify the action/entity etc
  2. Do a server-side redirect to the page as describe in item 1 above

So where is your issue that you find challenging?

Not the answer you’re looking for? Browse other questions tagged asp.net or ask your own question.


Hot Network Questions

Subscribe to RSS

To subscribe to this RSS feed, copy and paste this URL into your RSS reader.

site design / logo © 2020 Stack Exchange Inc; user contributions licensed under cc by-sa 4.0 with attribution required. rev 2020.11.12.35412

Преобразование / доступа к значениям QueryString в ASP.NET

December 2020

16.4k раз

Мне любопытно, что каждый делает для обработки / абстрагирование QueryString в ASP.NET. В некоторых из наших веб-приложений, я вижу много это всего сайта:

Какие лучшие способы справиться с этой грубостью?

7 ответы

Я, как правило, нравится идея абстрагирование их как свойства. Например:

Можно добавить еще проверку, если вы хотите. Но я склонен, как обертывание все мои строковых переменных запроса таким образом.

EDIT: — Кроме того, как другой плакат указал, что вы должны создать эти свойства на каждой странице. Мой ответ нет нет. Вы можете создать эти свойства в одном классе, который можно назвать «QueryStrings» или что-то. Тогда вы можете создать экземпляр этого класса на каждой странице, где вы хотите получить доступ к строкам запроса, то вы можете просто сделать что-то вроде

Таким образом, вы можете инкапсулировать всю логику для доступа и обработки каждого типа переменного запроса в одном обслуживаемом месте.

EDIT2: — А потому , что это экземпляр класса, вы можете также использовать инъекции зависимостей , чтобы ввести класс QueryStrings в любом месте вы используете его. StructureMap делает хорошую работу в этом. Это также позволяет импровизировать класс QueryStrings и впрыснуть , что если вы хотите сделать автоматическое тестирование устройства. Это гораздо легче высмеивать это до , чем объект запроса ASP.NET в.

Вот что я придумал. Он использует дженерики возвращать сильно типизированное значение из QueryString или дополнительного значения по умолчанию, если параметр не в QueryString:

С момента написания этого поста я написал очень небольшую библиотеку классов для манипулирования значениями строки запроса — см https://github.com/DanDiplo/QueryString-Helper

Одна вещь , вы не захватывая пустые значения здесь. Вы можете иметь URL вроде « http://example.com?someKey=&anotherKey=12345 » и в этом случае «someKey» значение паров является «» (пусто). Вы можете использовать string.IsNullOrEmpty () , чтобы проверить как для нулевых и пустых состояний.

Я бы также изменить «someKey» будет храниться в переменной. Таким образом, вы не повторять буквенные строки в нескольких местах. Это делает это легче поддерживать.

Надеюсь, это поможет!

По мне, лучший способ , чтобы получить строку запроса значения, как следующее:
Если строки запрос не найден , то значение val будет 0 .

Я с плакатом, который предложил методы хелперов (я бы прокомментировать его, но пока не может). Кто-то не согласен с ним в пользу создания свойств, но мой ответ на это, что он не корректно обработать вопрос о проверке нулям или недействительного форматирования и т.д. Если у вас есть вспомогательные методы, все, что логика может быть записана один раз и централизованная.

Если у вас есть много страниц, добавление свойств для каждого из них может быть больше времени, чем она стоит. Но это, очевидно, просто предпочтение, так что каждый его / ее собственная.

Одна прохладная вещь, которую вы могли бы улучшить на вспомогательный метод другого плаката, чтобы сделать выходной параметр ссылочного параметра вместо (изменение к исх). Таким образом, вы можете установить значение по умолчанию для свойства, в случае, если оно не прошло. Иногда вам может понадобиться дополнительные параметры, например, — то вы можете иметь его начать с некоторым значением по умолчанию для тех случаев, когда явно не прошел дополнительный параметр (проще, чем значение по умолчанию передается отдельно). Вы даже можете добавить параметр булево требуется копаться в конце, и он сгенерирует исключение, если BOOL установлено значение истинно, а параметр не передается. Это может быть полезно во многих случаях.

Илон Маск рекомендует:  Фунции регулярных выражений (perl совместимые)

NodeJS. Что такое Query Strings.

Всем привет! В этой статье мы рассмотрим, что такое Query Strings и как их использовать в NodeJS.


Query String – это строка запроса. Вы уже, наверняка, видели такие строки, где после знака вопроса идут какие-то параметры:

// пример строки запроса
http://site.ru/articles/science?page=7&start=1

Давайте научимся получать и использовать такую информацию из адресной строки в NodeJS и сразу рассмотрим все на полезном примере.

Немного изменим наш код в файле app.js:

Здесь мы создаем объект, в котором есть свойство qs, куда записывается еще один объект, полученный из метода query(), где записаны названия параметров(свойства) и их значения. Т.е., чтобы получить информацию из строки запроса, нам всего лишь нужно использовать уже готовый метод query() в NodeJS. Также, поскольку мы записываем все это вторым параметром метода render(), то вся эта информация будет сразу же отправлена в наш шаблон contact.ejs. Давайте туда сразу же и перейдем. После параграфа с описанием страницы вставьте этот код:

Как видно из кода, это очень простая форма для связи с кем-нибудь из какого-нибудь отдела. Однако нам может в адресной строке сразу прийти информация об этом, например, в таком виде:

И тогда мы сразу берем эту информацию из пришедшего из метода query() объекта и подставляем в нужные поля формы. Вот такой простой, но полезный пример.

А на этом сегодня все. Спасибо за внимание!

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

  • BB-код ссылки для форумов (например, можете поставить её в подписи):
  • Комментарии ( 0 ):

    Для добавления комментариев надо войти в систему.
    Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

    Copyright © 2010-2020 Русаков Михаил Юрьевич. Все права защищены.

    Что такое тип Request.QueryString () и как проверить, если он пустой?

    Может быть , это тривиальный вопрос, но я понятия не имею , что такое тип Request.QueryString() . Когда я проверяю его TYPEOF — это говорит , что это объект. Как проверить , какой объект он и какое свойство этого объекта является строкой в URL?

    Я делаю это сторона сервера с указанием языка

    Если у меня есть URL вроде этого: http://127.0.0.1/Kamil/Default.asp?name= тогда как проверить , если имя пустое? Это не пустое. Я знаю , что может преобразовать Request.QueryString(name) в строку и проверить , если это пустая строка «», но это правильный путь?

    Результат Request.Querystring (без имени не предусмотрено) является строкой. Результат Request.Querystring(«name») зависит от того , является частью строки запроса «имя», и если да, то имеет ли это значение.

    Таким образом, учитывая следующие строки запроса:


    Если вы читали их в переменные:

    вы получите следующие результаты: х = «1» (строка), у = «» (пустая строка), а г = Empty (специальное значение , которое будет автоматически конвертирует в строку или число в зависимости от того, как вы используете его, то есть как Empty = «» и Empty = 0 в каком — то смысле , верно).

    Запрос коллекция представляет собой объект , который наследует IRequestDictionary интерфейс.
    В JScript, это хорошая практика , чтобы использовать элемент , чтобы получить фактическое значение, а не неявные один из — за значения QueryString коллекции (также Форма и ServerVariables ) является IStringList на самом деле.
    Вы сказали , что вы знаете , C # , так что вы будете понимать следующую фиктивную декларацию QueryString.

    И еще несколько примеров, как вы должны проверить значения в JScript без преобразования строки.

    Как вы сохраняете значения querystring в asp.net mvc?

    каков хороший способ сохранения значений querystring в asp.net mvc?

    Если у меня есть url: /вопросов?Страница=2 & сортировать=новые & предметы=50 & showcomments=1 & Поиск=abcd

    на ссылках подкачки я хочу сохранить эти значения querystring во всех ссылках, чтобы они сохранялись, когда пользователь нажимает на «следующую страницу», например (в этом случае значение страницы изменится, но остальное останется прежним)

    Я могу придумать 2 способа сделать это:

    1. запрос.Querystring в представлении и добавьте значения в ссылки
    2. передайте каждое значение строки запроса от контроллера обратно в представление с помощью ViewData

    — один лучше другого? Это единственные варианты или есть лучший способ сделать это?

    4 ответов

    Я бы обработал строку запроса в представлении (ваш вариант #1), вместо того, чтобы передавать ее из контроллера. Этот подход делает представление более автономным, позволяя преобразовать его в элемент управления представлением и повторно использовать его в разных представлениях.

    Примечание: доступ к строке запроса непосредственно в представлении может показаться нарушением принципа проектирования разделения модели и представления, но на самом деле эти данные являются навигационной проблемой, которая связана с представлением, а не действительно часть модели.

    Я использую метод расширения для этого:

    Я бы просто сохранил значения в сеансе таким образом, что ссылки подкачки должны иметь только;

    одна из причин, почему я бы не нам QueryString, потому что я не хочу, чтобы пользователь видел значения, которые я передаю программе. Это делает его слишком легким для них, чтобы войти в адресную строку и начать изменять значения, чтобы «увидеть, что происходит». С этим кодом все, что они могли сделать, это менять номер страницы.

    вот как я это сделал в Asp.Net Core, сначала назначьте параметры строки запроса для ViewBags в вашем контроллере:

    затем передайте значения своим ссылкам следующим образом:

    обратите внимание, что каждая ссылка сохраняет свое собственное фактическое значение и передает остальные значения маршрута через то, что мы передали ViewBag.

    Удобная реализация GET-параметров страницы в ASP.NET

    Автор: Черняев Константин

    Опубликовано: 16.11.2012
    Исправлено: 10.12.2020
    Версия текста: 1.0

    Постановка проблемы

    При проектировании практически любого сайта появляется необходимость параметризовать страницу, передать ей параметры в адресной строке (URL). Однако инфраструктура ASP.NET дает возможность воспользоваться параметрами в коде страницы только с помощью объекта Request.QueryString , который имеет тип NameValueCollection . По сути это то же самое, что и Dictionary . То есть программист имеет максимум возможность по строке, означающей имя параметра, получить строку, содержащую переданное значение. При таком подходе возникают две проблемы – одна в том, что имя параметра содержится в не проверяемой компилятором C# строке, а вторая в том, что значение параметра – всегда строка, то есть тип string . Но параметр, например, может содержать числовой идентификатор, или перечисление через запятую числовых идентификаторов, или даже сложный сериализованный объект. Обычно эти проблемы решаются созданием в классе страницы примерно таких свойств:

    У такого подхода есть ряд серьезных недостатков:


    • получение и преобразование значения происходит при каждом обращении к свойству;
    • в классе страницы на каждый параметр нужно много лишних одинаковых строк;
    • много ручного копирования кода, если параметров несколько;
    • параметры могут быть как обязательными, так и необязательными, и программисту необходимо каждый раз думать, как это учитывать в реализации. Это несложно, но может стать лишним источником ошибок;
    • параметры могут быть разных типов, и каждый раз реализацию надо либо искать, чтобы скопировать, либо редактировать скопированную реализацию другого типа. Оба действия также могут быть источником ошибок;
    • в случае передачи неправильного значения параметра или его отсутствия, соответствующее этой ошибке исключение будет сгенерировано только во время исполнения при использовании этого параметра. Причем, скорее всего, это произойдет после многих действий, которые в этом случае не нужны или даже не должны быть выполнены. Например, если передана нечисловая строка для числового идентификатора, то об отображении объекта с таким идентификатором не может быть и речи, поэтому не нужно генерировать html всей страницы, достаточно выдать простую строку с сообщением об ошибке. Но часть жизненного цикла страницы будет уже выполнена;
    • возникают сложности в случае изменений (имени параметра, его типа), поскольку имя параметра встречается в тексте три раза, а от типа зависит весь код свойства.

    Неплохим шагом к решению обозначенных проблем может быть такой подход:

    Для каждого возможного типа параметра можно создать отдельный метод с сигнатурой Get FromQueryString( string name) , где — nullable -тип (то есть либо класс, либо Nullable<> от структуры). Определить этот метод, чтобы он в случае отсутствия нужного значения возвращал null , в случае ошибки формата генерировал исключение. Тогда использовать параметры становится значительно удобнее, но решается только половина описанных проблем, и то не полностью.

    Данная статья описывает подход, который полностью решит все указанные проблемы.

    Идея предлагаемого подхода достаточно проста. Предлагается все передаваемые через QueryString GET-параметры страницы собрать как свойства в одном классе, своем для каждой страницы. А на странице сделать свойство этого класса (точнее, у родителя страницы). Свойства-параметры сделать строго типизированными, то есть, например, переданный числовой идентификатор должен быть типа int , переданный список идентификаторов – int[] , а сложный сериализованный объект – соответствующего ему типа. Весь разбор и инициализацию провести на этапе Page_PreInit в родителе класса параметров, чтобы было как можно меньше повторяющегося кода. Если параметр обязателен, то в случае, когда он не передан, выводить пользователю простое и понятное сообщение об ошибке, а если необязателен – тип сделать nullable и инициализивать поле null ’ом, когда значение не передано.

    Кроме того, предлагаемая идея заключает в себе возможность в дополнение к непосредственно переданным параметрам иметь и объект, напрямую связанный с переданным значением. Например, если передается параметр «User >, то можно создать дополнительное поле User (типа UserDTO например), автоматически инициализирующееся объектом, хранящим в себе пользователя с номером 12.

    В предлагаемом подходе для каждой страницы создается свой класс с параметрами. Основная цель – максимально упростить использование GET-параметров, поэтому создаются эти классы с помощью автогенерации на основе простейшего описания в формате xml. Таким образом, решаются проблемы с любыми изменениями – имя и тип поля в описании встречаются ровно один раз, никакого ручного копирования текста не требуется.

    Реализация

    Чтобы появился класс, отвечающий за параметры страницы, нужно в файле Page.Parameters.xml написать соответствующий странице xml-тег. Приведем схемный пример с разнообразными параметрами:

    Каждый подтег f (сокр. от field) соответствует своему QueryString-параметру. Имя генерируемого свойства в классе определяется атрибутом name , имя GET-параметра либо совпадает с ним, либо, если нужно задать отличающееся, берется из атрибута QSname .

    Если тег помечен атрибутом canOmit = ‘true’ , и в качестве типа (атрибут type , который означает имя .NET-типа) указана структура, то тип свойства делается ? – добавляется символ «?», то есть получается Nullable<> . Тогда в случае, когда значение в URL’е не передано, свойство принимает значение null . Если же указано canOmit = ‘false’ , то, когда значение не передано, процедура инициализации генерирует исключение RequestParamsException – с сообщением об ошибке, что не передан обязательный параметр с указанием его имени. Разбор проходит на этапе Page_PreInit . В обработчике этого события страницы указанное исключение ловится, в этом случае пользователю показывается сообщение пойманного исключения, и обработка запроса прекращается ( Response.End ). Таким образом, в случае ошибки параметра никакой пользовательский код страницы выполнен не будет.

    Напомним, что событие PreInit отсутствует у мастер-страницы и присутствует у control-ов. Но у них оно вызывается после страницы. Поэтому обработчик Page_PreInit – самая ранняя точка (из «обычных», то есть не берем в расчет общие события из Global.asax ) в жизненном цикле страницы ASP.NET для исполнения пользовательского кода.

    Класс параметров генерируется вложенным в класс страницы, то есть создаются файлы с именем вида MyPage.Parameters.cs и содержанием вида:

    В результате создание класса получается очень простым и удобным – надо только написать несколько строчек простейшего xml (в котором работает IntelliSense из xsd-схемы), указать, что страница унаследована от нужного класса, и в свойстве Ps (сокр. от Parameters) страницы появляются проинициализированные типизированные значения из QueryString с полной обработкой ошибок.

    Реализация свойства Ps , хранящего в себе типизированные GET-параметры, находится в базовом классе страницы:

    Инициализируется свойство Ps на этапе Page_PreInit в указанном классе PageBase . Таким образом, при создании страницы делать ничего не надо – нужно только записать xml-тег и указать родителя страницы.

    За создание объекта Ps отвечает метод базового класса страницы CheckParsAndCreatePs , который определен так:

    Тип-параметр TParameters объявлен как наследник PageParametersBase . Предопределенный класс NoParams означает, что у страницы нет используемых параметров. Cобственно разбор QueryString происходит в конструкторе класса TParameters , которому передается HttpContext и объект доступа к БД Db . Выполняется метод CheckParsAndCreatePs так:

    Таким образом, чтобы в коде страницы, например, Users можно было использовать QueryString-параметры через свойство Ps , достаточно ее объявить так:

    или, если страница без параметров:

    Реализация класса без параметров тривиальна:

    Реализация базового класса для параметров PageParametersBase включает в себя все возможные методы получения значений и объектов из Request.QueryString . Эти методы можно разделить на три группы:

    1. Для получения параметра тривиального типа, например bool :

    2. Для получения массива. Например, если странице передается строка «1,2,3» , а значение параметра должно стать равным new[] < 1,2,3 >, нужно использовать такой метод:

    3. Для получения бизнес-объектов. Например, если передался параметр «User >, и свойство User должно стать объектом, соотвествующим пользователю с идентификатором 12, нужно использовать такой метод:

    Такие методы должны быть реализованы в классе, относящемся к конкретному проекту сайта, поскольку в проекте с базовым классом PageParametersBase нет бизнес-классов (так как он слишком общий), и они в каждом проекте сайта могут быть свои. Пример объявления:


    Сами классы, хранящие QueryString-параметры, представляют собой практически DTO, то есть содержащие в себе только свойства без поведения, например, так:

    Инициализируются свойства, как уже было указано, в конструкторе посредством указанных групп методов таким образом:

    Здесь _c и _db – переданные в конструктор объекты HttpContext и Db . Метод ResetObjects бывает нужен, чтобы переинициализировать заново объекты из идентификаторов, если стало известно, что они поменялись (например, на странице редактирования пользователя после его сохранения). Метод FillAddon бывает полезно определить, когда нужно как-то доинициализировать объекты, или если необходимо добавить свойство, напрямую не зависящее от QueryString.

    Приведу примеры, когда удобно использовать метод FillAddon .

    1. Предположим, на портале форума есть страница, на которой производится поиск сообщений, в частности, по автору. Тогда весьма вероятно, что идентификатор пользователя (или список идентификаторов) нужно вывести в параметры страницы, чтобы можно было передавать URL с заполненным фильтром. Предположим также, что кроме явно заданных идентификаторов пользователей (назовем параметр UserIds ) можно задавать дополнительные условия фильтра по автору – роли пользователя, его группы, строка поиска (маска на ФИО или логин), рейтинг, компания-работодатель.

    Тогда удобно сделать следующее. В дополнительной partial -части класса параметров объявляем новое поле int[] FilterByUsers и реализуем метод FillAddon , инициализируя в нем FilterByUsers на основе всех переданных перечисленных выше параметров:

    И в результате получаем, что на странице достаточно просто использовать Ps.FilterByUsers без Ps.UserId , а тот факт, что поиск авторов тоже выполняется сложным поиском, никак не влияет на код страницы.

    2. Предположим, есть страница с двумя параметрами, и есть условие, что должен быть задан хотя бы один из них – любой, но хотя бы один. Тогда в xml-описании оба параметра нужно пометить как необязательные ( canOmit = ’false’ ), но определить FillAddon :

    3. Предположим, есть страница, отвечающая за выполнение нескольких команд. У нее есть параметр, содержащий имя команды, и набор других параметров, для каждой команды свой, причем наборы могут пересекаться. Вероятно, в этом случае хорошим решением будет сделать для каждой команды свою страницу, но, если html-ответ примерно одинаков, это не обязательно – можно использовать паттерн Команда и тогда страницы будут просто дублировать код друг друга.

    В рамках предлагаемого подхода удобно будет разрешить эту ситуацию следующим образом. В параметры страницы в xml-описании записываем все параметры всех команд, помечая их как необязательные ( canOmit = ’false’ ), и для проверки правильности переданных аргументов определяем метод FillAddon, например, так:

    Как использовать генератор

    Если имеется несколько проектов ASP.NET, то удобно делать так.

    1. Сам генератор Page.Parameters.tt кладем в общий репозитарий компании (вместе с ним схему Page.Parameters.xsd , и вспомогательный файл Common.tt ), назовем его My.Common .

    2. В репозитарии с проектом сайта, где планируется использовать генератор, делаем My.Common субмодулем.

    3. В проекте сайта создаем файл Include_Page.Parameters.tt с таким простым содержанием:

    Использовать генератор нужно в каждом репозитарии, где есть проект сайта. Важно, чтобы генератор (или его прокси Include_Page.Parameters.tt ) находился в одном проекте с сайтом, потому что он генерирует partial -части классов страниц сайта, и поэтому не может быть в другом проекте.

    4. Чтобы в xml-описании работал intellisense, достаточно в проекте сайта положить не сам файл xsd-схемы Page.Parameters.xsd , а ссылку на него (он лежит в My.Common ):

    5. В одной папке с прокси для генератора Include_Page.Parameters.tt создаем файл-описание Page.Parameters.xml , нацеливаем на него xsd-схему и начинаем заполнять.

    6. Запускаем генерацию. Появляются классы, отвечающие за реализацию GET-параметров.

    7. Используем классы параметров в коде страниц.

    Если же проект один, то, конечно, проще положить файлы Page.Parameters.tt , Common.tt и Page.Parameters.xsd в проект с сайтом.

    Результат

    Применение описанного подхода дает следующие плюсы:

    • Строго типизированные параметры.
    • Все преобразования и десериализация проходят прозрачно.
    • Автоматическая инициализация объекта, содержащего параметры, происходит заведомо ранее любой необходимости его использования.
    • Простота использования. Для создания класса с параметрами достаточно написать простейший тег в xml-описании и указать родителя страницы.
    • Простота модификации при любом изменении в параметрах страницы.
    • Обработка ошибок. Предусмотренные ошибки: неправильный формат, отсутствие обязательного параметра, отсутствующий объект. Кроме того, есть возможность через FillAddon добавить произвольную проверку. Строки сообщений – user-friendly. В случае ошибки никакой пользовательский код страницы исполнен не будет.
    • Простота восприятия класса страницы – лишний код в классе страницы полностью отсутствует.
    • Возможность легко добавить дополнительные параметры, зависящие от QueryString не напрямую (и инициализировать их в методе FillAddon ).

    Создаем простой API-шлюз в ASP.NET Core

    Привет, Хабр! Представляю вашему вниманию перевод статьи «Creating a simple API Gateway in ASP.NET Core».


    В моей предыдущей статье, JWT аутентификация для микросервисов в .NET, я рассмотрел процесс создания микросервиса для аутентификации пользователей. Это может быть использовано для проверки личности пользователя перед совершением любых действий в других компонентах системы.

    Другой жизненно необходимый компонент для работы продукта это API-шлюз — система между приложением и бэкэндом, которая, во-первых, маршрутизирует входящие запросы на соответствующий микросервис, и во-вторых, авторизует пользователя.

    Существует много фреймворков которые могут быть использованы для создания API-шлюза, например, Ocelot в .NET core или Netflix Zuul в Java. Тем не менее, в этой статье я опишу процесс создания простого API-шлюза с нуля в .NET Core.

    Создание проекта

    Для начала создадим новое приложение, выбрав ASP.NET Core Web Application в окне создания проекта и Empty в качестве шаблона.

    В проекте будут лежать классы Startup и Program. Для нас самой важной частью является метод Configure класса Startup. Здесь мы можем обработать входящий HTTP-запрос и ответить на него. Возможно, в методе Configure будет находится следующий код:

    Написание маршрутизатора

    Так как именно в методе Configure мы будем обрабатывать запросы, напишем необходимую логику:

    Сначала мы создаем объект типа Router. В его задачи входит хранение существующих маршрутов, валидация и отправка запросов согласно маршрутам. Чтобы сделать код более чистым, будем подгружать маршруты из JSON-файла.

    В итоге получается следующая логика: после того, как запрос поступит на шлюз, он будет перенаправлен маршрутизатору, который, в свою очередь, отправит его на соответствующий микросервис.

    Перед тем как писать класс Router, создадим файл routes.json. В этом файле укажем список маршрутов, каждый из которых будет содержать внешний адрес (endpoint) и адрес назначения (destination). Также, мы добавим флаг, сигнализирующий о необходимости авторизации пользователя перед перенаправлением.

    Вот как примерно может выглядеть такой файл:

    Создаем класс Destination

    Мы теперь знаем, что каждый Route должен иметь endpoint и destination , а каждый Destination должен иметь поля uri и requiresAuthentication .

    Теперь напишем класс Destination, помня о том. Я добавлю два поля, два конструктора и приватный конструктор без параметров для JSON-десериализации.

    Также, будет правильно написать в этом классе метод SendRequest . Этим мы покажем, что каждый объект класса Destination будет ответственнен за отправку запроса. Этот метод будет принимать объект типа HttpRequest , который описывает входящий запрос, вынимать оттуда всю необходимую информацию и отправлять запрос на целевой URI. Для этого напишем вспомогательный метод CreateDestinationUri , который будет соединять строки с адресом и параметры адресной строки (query string) от клиента.

    Теперь мы можем написать метод SendRequest , который будет отправлять запрос на микросервис и получать ответ обратно.

    Создаем JSON-парсер.

    Перед написанием класса Router, нам нужно создать логику для десериализации JSON-файла с маршрутами. Я создам для этого вспомогательный класс, в котором будет два метода: один для создания объекта из JSON-файла, а другой для десериализации.

    Класс Router.

    Последнее, что мы сделаем перед написанием Router — опишем модель маршрута:

    Теперь напишем класс Router, добавив туда поля и констурктор.

    Я использую динамический тип (dynamic type) для чтения из JSON и записи в него свойств объекта.

    Теперь все готово для описания главной фнукциональности API-шлюза: маршрутизация и авторизация пользователя, которая будет происходить в методе RouteRequest . Нам нужно распаковать базовую часть внешнего адреса (base endpoint) из объекта запроса. Например, для адреса /movies/add базой будет /movies/ . После этого, нам нужно проверить, есть ли описание данного маршрута. Если да, то авторизуем пользователя и отправляем запрос, иначе возвращаем ошибку. Я также создал класс ConstructErrorMessage для удобства.

    Для авторизации, я предпочел следующий путь: извлекаем токен из заголовка запроса и отправляем как параметр запроса. Возможен и другой вариант: оставить токен в заголовке, тогда извлекать его должен уже микросервис, которому предназначается запрос.

    Заключение

    Создание базового API-шлюза не требует много усилий, но он не предоставит должной фукнциональности. Если вам нужен балансировщик нагрузки, вы можете посмотреть на уже существующие фреймворки или платформы, которые предлагают библиотеки для маршрутизации запросов.

    Весь код из этой статьи доступен в репозитории на GitHub

    Илон Маск рекомендует:  Что такое код globalsize
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL