Не удалось разрешить тип с токеном 0100028 из typeref из BrowserCapabilitiesFactory в Mono

В настоящее время я создаю небольшой встроенный веб-сервер с использованием Mono (с использованием MonoDevelop в Linux). Пытаясь определить тип браузера по рекомендации из примера кода, я столкнулся с проблемой. Программа компилируется правильно, но приведенный ниже код приводит к сбою программы при входе в функцию, в которой она объявлена:

using System.Collections;
using System.Collections.Specialized;
using System.Web;
using System.Web.Configuration;

[...]

var l_caps = new HttpBrowserCapabilities
{
  Capabilities = new Hashtable { { string.Empty, p_http_context.Request.UserAgent } }
};

var l_capsFactory = new BrowserCapabilitiesFactory();

l_capsFactory.ConfigureBrowserCapabilities(new NameValueCollection(), l_caps);

Приведенный выше код должен был анализировать строку пользовательского агента на предмет заголовков запроса (присутствующих в p_http_context.Request.UserAgent), позволяя раскрыть возможности клиентского браузера на стороне сервера в объекте l_caps. Однако, если в коде присутствует следующая строка, как только поток программы достигает функции, возникает исключение, описанное ниже. Комментирование строки позволяет избежать исключения, но только потому, что оно удаляет функциональность:

var l_capsFactory = new BrowserCapabilitiesFactory();

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

System.TypeLoadException: не удалось разрешить тип с токеном 01000028 из typeref (ожидаемый класс> 'System.Web.Configuration.BrowserCapabilitiesFactory' в сборке 'System.Web, Version = 4.0.0.0, Culture = нейтральный, PublicKeyToken = b03f5f7f11d50a3a') на сервере .Context.onNewRequest (System.Object p_origin,> Server.Listener + NewContextEventArgs p_args) [0x000b9] в Context.cs: 143

У меня нет пакета NuGet. Я не использую ASP.Net, это чистое консольное приложение (демон), использующее HttpListener. Таким образом, обычные методы получения возможностей браузера недоступны (а именно Request.Browser в этом контексте недоступен).

Я пробовал следующее:

  • разные версии задействованных библиотек;
  • очищающий раствор;
  • удаление всех папок bin и obj из решения и подпроектов;
  • сборка как в режиме отладки, так и в режиме выпуска;
  • переустановка;
  • комбинации вышеперечисленного.

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

Версии:

  • Моно 5.18.1.3
  • .Net Framework 4.7, 4.7.1, 4.7.2
  • Версия C #: все с 5 по 7.3
  • MonoDevelop 7.8.2
  • Linux Ubuntu 18.04

В качестве попытки грубо диагностировать это, я также нашел монобиблиотеки в / usr / lib / mono для токена "BrowserCapabilitiesFactory", что дало положительные результаты.

Есть ли у кого-нибудь предложения по решению для дальнейшей диагностики данной ситуации?

Мне не хватает каких-либо дополнительных ссылок на сборку в проекте?


person Joaommp    schedule 12.05.2019    source источник
comment
Вы используете http, поэтому я бы использовал сниффер, например wirehark или fiddler, и получил бы фактический возвращаемый элемент из сниффера. Я бы проверил, есть ли статус 200 OK или что-то еще. Есть два режима http: 1) 1.0, который является потоковым, 2) 1.1, который является режимом фрагментов. Я подозреваю, что вы используете 1.1 и получаете только один ответ, а время ожидания соединения истекает из-за того, что не было отправлено следующее сообщение фрагмента.   -  person jdweng    schedule 13.05.2019
comment
Ваш ответ не имеет никакого отношения к рассматриваемой проблеме. Кроме того, соединение работает нормально, программа начала получать это исключение только после того, как я добавил строку. HTTP работает нормально, и поскольку программа является сервером, это программа, которая фактически отправляет статус. Кроме того, статус отправляется только после получения информации о браузере.   -  person Joaommp    schedule 13.05.2019
comment
Есть масса подобных проблем, и никто не работает над их исправлением. Поэтому во всех случаях вам следует подумать о переходе на .NET Core, который находится в активной разработке. Вы должны знать, что Mono уйдет, когда .NET 5 выйдет в 2020 году.   -  person Lex Li    schedule 16.05.2019
comment
Это означало бы воссоздание проекта с нуля и копирование старых источников, в которых может быть не все, что доступно в .NET Core. Я тоже читал эти новости, и мой пост предшествовал этим новостям. В любом случае переход на .NET Core в настоящий момент может оказаться невозможным.   -  person Joaommp    schedule 17.05.2019
comment
@LexLi: Из интервью Ричарду Лендеру в The Register: Несмотря на это, Моно никуда не денется, - сказал он Рег. Мы будем вкладывать меньше инженерных усилий в Mono. В основном он перейдет в .NET 5.0. Сообщество, вероятно, будет вкладывать меньше инженерных усилий, и постепенно рабочие нагрузки перейдут на .NET 5.0. Но мы не собираемся убивать проект. По-прежнему существуют большие приложения, которые зависят от Mono и могут никогда не портироваться для использования .NET 5.0. Значит, это определенно не исчезнет в 2020 году.   -  person Joaommp    schedule 17.05.2019
comment
Проект с открытым исходным кодом почти не умирает, но если вы серьезно являетесь пользователем / разработчиком, вам следует отказаться от неактивных проектов (или сценариев, которые они больше не охватывают). Итак, сегодня это означает ASP.NET 4.x на Mono (ваш случай) или MonoDevelop на Windows / Mac, а завтра это означает больше технологий, основанных на Mono.   -  person Lex Li    schedule 17.05.2019
comment
@LexLi: как четко указано в исходном сообщении выше: Я не использую ASP.Net. Итак, ASP.NET 4.x на Mono - это совсем не так. Это автономное консольное приложение, использующее HttpListener. Использование .Net Core до сих пор оказалось безрезультатным, несмотря на попытки. Это приложение .Net, работающее на Mono для Linux, разработанное в MonoDevelop.   -  person Joaommp    schedule 18.05.2019
comment
Привет. Та же проблема с токеном 01000039 класса System.Web.Instrumentation.PageInstrumentationService. Класс выглядит как существующий в моем mono / 4.6.2-api / System.Web.dll. Не знаю, как исправить.   -  person SandRock    schedule 30.01.2021