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

есть приложение, которое используетRequest.Browser.MajorVersion как часть ключа кеша. Перед нами стоит задача определить, какой ключ кэша использовался для набора исторических запросов. Для этого мы анализируем журналы IIS, поэтому необходимо определить, какое значение было бы для ASP.NET.Request.Browser.MajorVersion за каждый запрос. Можно ли получить это из одной строки агента пользователя?

ОБНОВИТЬ

Я изначально предполагал ценностьRequest.Browser.MajorVersion будет версия, взятая непосредственно из строки агента пользователя. Однако в сеансе отладки для подтверждения этой теории я вижу это:

Я бы ожидалRequest.Browser.MajorVersion быть 61, а не 44. Может ли кто-нибудь дать представление о том, почему эти значения отличаются, и как я мог бы с уверенностью сказать, какова ценностьRequest.Browser.MajorVersion будет для данной строки агента пользователя?

ОБНОВЛЕНИЕ 2

Я обнаружил, что ASP.NET использует набор шаблонов для созданияHttpBrowserCapabilities объект установлен какRequest.Browser, Они доступны здесь:

% SystemRoot% \ Microsoft.NET \ Framework [версия] \ Config \ браузеры

Глядя на шаблоны, все они используют регулярные выражения для анализа строки пользовательского агента (я вставил содержимое chrome.browser ниже), что говорит о том, чтоRequest.Browser.MajorVersion должен соответствуют значению в строке агента пользователя. Так что до сих пор не знаю, почему мое локальное приложение возвращает 44 в качестве этого значения.

<browsers>
    <!-- Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.1 (KHTML, like Gecko) Chrome/2.0.168.0 Safari/530.1 -->
    <browser id="Chrome" parentID="WebKit">
        <identification>
            <userAgent match="Chrome/(?'version'(?'major'\d+)(\.(?'minor'\d+)?)\w*)" />
        </identification>

        <capabilities>
          <capability name="browser"                         value="Chrome" />
          <capability name="majorversion"                    value="${major}" />
          <capability name="minorversion"                    value="${minor}" />
          <capability name="type"                            value="Chrome${major}" />
          <capability name="version"                         value="${version}" />
          <capability name="ecmascriptversion"               value="3.0" />
          <capability name="javascript"                      value="true" />
          <capability name="javascriptversion"               value="1.7" />
          <capability name="w3cdomversion"                   value="1.0" />
          <capability name="supportsAccesskeyAttribute"      value="true" />
          <capability name="tagwriter"                       value="System.Web.UI.HtmlTextWriter" />
          <capability name="cookies"                         value="true" />
          <capability name="frames"                          value="true" />
          <capability name="javaapplets"                     value="true" />
          <capability name="supportsCallback"                value="true" />
          <capability name="supportsDivNoWrap"               value="false" />
          <capability name="supportsFileUpload"              value="true" />
          <capability name="supportsMaintainScrollPositionOnPostback" value="true" />
          <capability name="supportsMultilineTextBoxDisplay" value="true" />
          <capability name="supportsXmlHttp"                 value="true" />
          <capability name="tables"                          value="true" />
        </capabilities>
    </browser>
</browsers>

ОБНОВЛЕНИЕ 3

Я наконец дошел до сути этого. Оказывается, что приложение, которое я отлаживал, использовало сторонний сервис под названием51 градус который перехватывает запрос и применяет собственный анализ заголовка запроса, в этом случае используя базу данных, установленную локально на сервере приложений. Эта база данных устарела и, следовательно, дает странные результаты для более поздних версий браузеров. Мои данные в обновлении 2 выше действительны для приложений Vanilla ASP.NET, но это объясняет, почему мои результаты отличались от среды тестирования Vanilla. Спасибо всем, кто пожалел время, чтобы помочь мне разобраться в этом.

 mjwills12 окт. 2017 г., 13:26
Есть ли какая-то конкретная причина, по которой вы хотите 44, когда 61 - это правильный ответ?
 getsetcode12 окт. 2017 г., 13:25
Спасибо. Я не сталкивался с этим. Я только что попытался, и он, кажется, не возвращает смей мажорную версию как .NET Framework. Например, при передаче пользовательского агента «Mozilla / 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit / 537.36 (KHTML, как Gecko) Chrome / 61.0.3163.100 Safari / 537.36» возвращает 61 в качестве основной версии. Но тот же пользовательский агент в ASP.NET имеет Request.Browser.MajorVersion == 44. Я понятия не имею, откуда .NET получает эти 44 от ...
 Alex Kudryashev28 окт. 2017 г., 20:32
Я не могу воспроизвести ваш результат. В моем сеансе отладки Chrome 61.0 возвращаетсяRequest.Browser.MajorVersion == 61, Firefox 56.0 возвращает 56, а Edge (немного неожиданно) возвращаетRequest.Browser.Browser ==Chrome а такжеRequest.Browser.MajorVersion == 52. Все эти значения существуют вUserAgent строки.
 mjwills12 окт. 2017 г., 13:02
Есть лиgithub.com/ua-parser/uap-csharp Помогите?
 Joel Coehoorn26 окт. 2017 г., 16:20
Короткий ответ: «НЕТ», по крайней мере, не на 100% надежно, потому что некоторые браузеры позволяют вам играть со строкой useragent. Но вы можете подобраться достаточно близко, чтобы удовлетворить ваши потребности.

Ответы на вопрос(1)

Эта страница расскажет вам строку вашего агента:

http://www.useragentstring.com/

Эта страница покажет вам строку агента для большинства браузеровhttp://www.useragentstring.com/pages/useragentstring.php

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

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

Ваш ответ на вопрос