Получаване Не може да се разреши тип с токен 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=neutral, 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

Като опит за груба диагностика на това, аз също направих grepping моно библиотеките в /usr/lib/mono за токена „BrowserCapabilitiesFactory“, давайки положителни резултати.

Някой има ли някакви предложения за решаване на по-нататъшното диагностициране на тази ситуация?

Липсва ли някаква допълнителна справка за сглобяване в проекта?


person Joaommp    schedule 12.05.2019    source източник
comment
Вие използвате http, така че бих използвал снифър като wireshark или 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: От интервю с Richard Lander в The Register: Въпреки това Моно няма да си отиде, каза той пред The ​​Reg. Ще инвестираме по-малко инженерни усилия в 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
здрасти Същият проблем с клас System.Web.Instrumentation.PageInstrumentationService токен 01000039. Класът изглежда съществува в моя mono/4.6.2-api/System.Web.dll. Нямам идея как да поправя.   -  person SandRock    schedule 30.01.2021