Конфигурирование и настройка Microsoft ASP.NET

       

Элементы, входящие в раздел <browserCaps>


Имеется несколько элементов, которые можно использовать в разделе <browserCaps>. Первым из них является элемент <result>. Он определяет имя класса, хранящего информацию, полученную из раздела <browserCaps>. Ниже показан элемент <result> из файла machine.config сервера.

<result type="System.Web.Mobile.MobileCapabilities, System.Web.Mobile, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

Свойство type указывает на класс, который хранит все пары имя/значение. Класс, на который указывает тег result, может использоваться процессом ASP.NET для чтения значений и настройки вывода HTML.

Раздел <browserCaps> использует серверные переменные IIS, взятые из заголовка запроса HTTP. Элемент <use> определяет серверную переменную, которая будет источником информации, например:

<use var="HTTP_USER_AGENT" as="Agent" />

Здесь показано, что информация о возможностях браузера берется из серверной переменной IIS HTTP_USER_AGENT. Свойство as делает серверную переменную доступной для всех остальных разделов. В этом примере в разделе <browserCaps> есть ссылка на переменную Agent и чтение из этой серверной переменной данных. Далее я опишу пару используемых для этого способов, но сперва рассмотрим другие элементы из раздела <browserCaps>.

Сердцем раздела <browserCaps> является элемент <filter>. Он ищет соответствия текста, содержащегося в серверных переменных, регулярным выражениям, а затем создает список параметров браузера, который должен быть включен в класс браузера. Ниже приведен синтаксис элемента <filter>.

<filter match="regex to match" with="string to search"> name=value name=value </filter>

Регулярное выражение в свойстве match сравнивается со строкой из свойства with. Если свойство with не объявлено, то используется строка в выражении <use>. Если соответствие между регулярным выражением из свойства match и строкой, содержащейся в свойстве with либо в операторе <use>, найдено, то пара имя/значение включается в класс возможностей браузера и генерируется корректный HTML, отправляемый клиенту.
Элемент <filter> включает субэлемент с именем <case>. Элемент <case> используется аналогично элементу <filter> и содержит свойства match и with, которые сопоставляют строку с регулярным выражением. Элемент <case> используется аналогично оператору case из VB. В элемент <filter> можно включить несколько элементов <case>. При обнаружении совпадения в операторе <case> пропускаются остальные операторы <case> из этой группы. Ниже приведен синтаксис элемента <case>.

<filter> <case match="regex to match" with="string to search"> name=value name=value </case> <case match="regex to match" with="string to search"> name=value name=value </case> </filter>

Используется первый элемент <case>, который находит совпадение, а остальные элементы case игнорируются. Это несколько непонятно, так что давайте посмотрим на пример.

<use var="HTTP_USER_AGENT" /> <filter> <case match="Windows 95|Win95"> platform=Win95 </case> <case match="Windows 98|Win98"> platform=Win98 </case> <case match="Windows NT 5.1|Windows XP"> platform=WinXP </case> <case match="Windows NT 5.0|Windows 2000"> platform=Win2000 </case> <!-- extra removed --> </filter>

Этот пример не имеет объявления свойства with, так что элементы <case> будут искать строку, объявленную в последнем элементе <use>. В данном случае эта строка является серверной переменной HTTP_USER_AGENT. Вот как обрабатывается элемент <filter>.

  1. Обрабатывается первый case и производится поиск в переменной HTTP_USER_AGENT на предмет того, содержится ли в ней строка "Windows 95" или "Win95".
  2. Если эта строка содержит одно из этих значений, то пара имя/значение из элемента <case> добавляется в класс возможностей браузера, указанный в элементе <result>.
  3. Если совпадение найдено, то все остальные элементы <case> не обрабатываются и обработка элемента <filter> завершается.
  4. Если совпадение не найдено, то обрабатывается следующий элемент <case>, и вся процедура повторяется.


    Если совпадений не найдено, элемент <filter> завершается без добавления в класс пары имя/значение, и начинается обработка следующего элемента <filter>.


В этом процессе обработчик раздела проходит по разделу <browserCaps> фильтр за фильтром и case за case до тех пор, пока класс возможностей браузера не заполнится парами имя/значение, которые описывают браузер или устройство, используемое для доступа к ресурсу. Чтобы лучше это себе представить, давайте посмотрим на более сложный элемент <filter>, взятый непосредственно из файла machine.config.

<use var="HTTP_VIA" as="via"/> <filter> <case match="Nokia" with="%{via}"> <filter> <case with="%{via}" match= "(?’nokiaVersion’Nokia\D*(?'gatewayMajorVersion'\d+) (?’gatewayMinorVersion'\.\d+)[^,]*)"> gatewayVersion = ${nokiaVersion} gatewayMajorVersion = ${gatewayMajorVersion} gatewayMinorVersion = ${gatewayMinorVersion} </case> </filter> </case> </filter>

Это один из наиболее сложных элементов <filter>, чье назначение состоит в определении того, является устройство, получающее доступ, устройством Nokia. Если это устройство Nokia, элемент <filter> извлекает из серверной переменной gatewayVersion, gatewayMajorVersion и gatewayMinorVersion. Эта информация добавляется в класс возможностей браузера и используется при создании HTML для отправки в браузер. Есть пара соглашений, используемых в этом операторе <filter>, которые не использовались в предыдущих операторах <filter> (большинство из них работает с регулярными выражениями). Я опишу каждое из них при рассмотрении оператора <filter>. Первый элемент в этом примере – это элемент <use>.

<use var="HTTP_VIA" as="via"/>

Этот элемент делает серверную переменную HTTP_VIA доступной для элементов <filter> как переменную via. Элемент <use> необходим, так как информация, которую вы ищете, содержится не в серверной переменной по умолчанию HTTP_USER_AGENT, а в переменной HTTP_VIA.


Первые элементы <filter> и <case> таковы:

<filter> <case match="Nokia" with="%{via}">

Первый оператор <case> производит поиск строки Nokia в переменной via. Если строка Nokia в переменной via найдена, обрабатываются элементы <filter> и <case> внутри этого оператора <case>. Вот как выглядят элементы <filter> и <case>, включенные в этот оператор.

<filter> <case with="%{via}" match= "(?'nokiaVersion’Nokia\D*(?'gatewayMajorVersion'\d+) (?'gatewayMinorVersion'\.\d+)[^,]*)"> gatewayVersion = ${nokiaVersion} gatewayMajorVersion = ${gatewayMajorVersion} gatewayMinorVersion = ${gatewayMinorVersion} </case> </filter>

Оператор <case> в этом примере ищет несколько различных переменных и делает их доступными для класса возможностей браузера, который будет настраивать HTML, отправляемый в браузер.

Если просмотреть раздел <browserCaps> файла machine.config, то можно обнаружить множество различных элементов <filter> и <case>, похожие на показанный только что. Количество информации в нем поражает; он дает ASP.NET возможность настраивать HTML для большого количества браузеров и мобильных устройств.


Содержание раздела