C# 获得;无法从typeref“中解析带有标记0100028的类型;来自Mono的BrowserCapabilities工厂

C# 获得;无法从typeref“中解析带有标记0100028的类型;来自Mono的BrowserCapabilities工厂,c#,.net,mono,C#,.net,Mono,我目前正在使用Mono(在Linux上使用MonoDevelop)构建一个小型嵌入式web服务器。在尝试使用代码示例中的建议检测浏览器类型时,我遇到了一个问题。程序编译正确,但以下代码会导致程序在进入声明函数时崩溃: 使用系统集合; 使用System.Collections.Specialized; 使用System.Web; 使用System.Web.Configuration; [...] var l_caps=新的HttpBrowserCapabilities { 能力=新哈希表{{str

我目前正在使用Mono(在Linux上使用MonoDevelop)构建一个小型嵌入式web服务器。在尝试使用代码示例中的建议检测浏览器类型时,我遇到了一个问题。程序编译正确,但以下代码会导致程序在进入声明函数时崩溃:

使用系统集合;
使用System.Collections.Specialized;
使用System.Web;
使用System.Web.Configuration;
[...]
var l_caps=新的HttpBrowserCapabilities
{
能力=新哈希表{{string.Empty,p_http_context.Request.UserAgent}
};
var l_capsFactory=新的BrowserCapabilitiesFactory();
l_capsFactory.ConfigureBrowserCapabilities(新的NameValueCollection(),l_caps);
上面的代码应该解析请求头的用户代理字符串(出现在p_http_context.request.UserAgent上),允许客户端浏览器的功能在l_caps对象中向服务器端公开。但是,如果代码中存在以下行,程序流一到达函数,就会引发下面描述的异常。注释行可以避免异常,但仅因为它删除了以下功能:

var l_capsFactory=new BrowserCapabilitiesFactory();
得到的误差如下:

System.TypeLoadException:无法从typeref解析标记为01000028的类型(程序集'System.Web,版本=4.0.0.0,区域性=中性,PublicKeyToken=b03f5f7f11d50a3a'中的类应为'System.Web.Configuration.BrowserCapabilitiesFactory' 在Context.cs:143中的Server.Context.onnerRequest(System.Object p_origin,>Server.Listener+NewContextEventArgs p_args)[0x000b9]处

我没有任何NuGet软件包。我不是使用ASP.Net,而是使用HttpListener的纯控制台应用程序(守护进程)。因此,获取浏览器功能的传统方法不可用(即Request.browser在此上下文中不可用)

我尝试了以下方法:

  • 所涉图书馆的不同版本
  • 清洗溶液
  • 从解决方案和子项目中删除所有bin和obj文件夹
  • 在调试和发布模式下构建
  • 重新安装
  • 上述各项的组合
我也在堆栈溢出和其他平台上搜索了几个类似问题的解决方案,但这些问题的解决方案都没有对这种特定情况产生任何积极影响。示例:

版本:

  • Mono 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中的mono库灰显为“BrowserCapabilitiesFactory”标记,得到了积极的结果

有没有人对进一步诊断这种情况有什么建议


我是否缺少项目中的任何其他程序集引用?

您正在使用http,因此我将使用wireshark或fiddler之类的嗅探器,并从嗅探器中获取实际返回项。我会检查状态是否为200 OK或其他。有两种http模式1)1.0是流模式2)1.1是块模式。我怀疑您正在使用1.1,并且只收到一个响应,并且由于没有发送下一个chunk消息,连接正在超时。您的响应与手头的问题完全无关。除了连接工作正常外,程序只有在我添加行后才开始出现异常。HTTP工作正常,因为程序是服务器,所以实际发送状态的是程序。此外,只有在收到浏览器信息后才会发送状态。存在大量类似问题,而且没有人进行修复。因此,在所有情况下,您应该考虑切换到.NET内核,这是在积极开发中。您应该知道,当.NET5在2020年发布时,Mono将消失。这意味着从头开始重新创建项目,并复制旧的源代码,而旧的源代码在.NETCore中可能没有所有可用的内容。我也读过那些新闻,我的帖子比那些新闻早。无论如何,现在转换到.NET内核可能是不可行的。@LexLi:尽管如此,Mono不会消失,他告诉Reg。“我们将在Mono上投入较少的工程精力。它将主要流入.NET 5.0。社区可能会投入较少的工程精力,工作负载将逐渐转移到.NET 5.0。但我们不会试图扼杀该项目。仍然有一些大型应用程序依赖Mono,并且可能永远不会移植到.NET 5.0上。”因此,这意味着它肯定不会在2020年消失。