Mono中使用WebRequest的问题
我在ServiceStack web应用程序(由Mono上的XSP托管)中遇到了一个非常奇怪的WebRequest问题。 请求模块的注册似乎以一种非常奇怪的方式工作;我正在使用WebRequest创建一个HTTP请求,但它失败了,因为它无法找到该“前缀”(HTTP)的创建者 我看到的异常是Mono中使用WebRequest的问题,mono,httpwebrequest,servicestack,xsp,Mono,Httpwebrequest,servicestack,Xsp,我在ServiceStack web应用程序(由Mono上的XSP托管)中遇到了一个非常奇怪的WebRequest问题。 请求模块的注册似乎以一种非常奇怪的方式工作;我正在使用WebRequest创建一个HTTP请求,但它失败了,因为它无法找到该“前缀”(HTTP)的创建者 我看到的异常是NotSupportedException,我能够跟踪到没有为HTTP前缀注册创建者这一事实(我正在点击,大约第479行) 编辑:更多详细信息:NotSupportedException由WebRequest.
NotSupportedException
,我能够跟踪到没有为HTTP前缀注册创建者这一事实(我正在点击,大约第479行)
编辑:更多详细信息:NotSupportedException
由WebRequest.GetCreator
引发,它使用URL前缀作为键来选择要返回的创建者;在我的例子中,一个HttpRequestCreator
。引发异常是因为没有为“HTTP”前缀注册的创建者(实际上根本没有创建者)
所以我搜索了一下Mono源代码,发现模块是(或应该)添加到system.web的webRequestModules部分的*.config文件之一
我查看了machine.config文件,它在那里:
System.Net.HttpRequestCreator,系统,版本=4.0.0.0
看着
似乎前缀确实是从配置中添加的,在类静态构造函数中(不是一个好的选择,IMHO,但仍然..应该可以工作)
为了测试它,我尝试在我的web.config
中的system.net/webRequestModules
中添加一个HttpRequestCreator
;这是由XSP/Mono加载的,并导致重复的密钥异常(这是预期的,因为HttpRequestCreator应该已经加载,因为它已经存在于machine.config中)
更奇怪的是:如果我为Http添加模拟处理程序,如下所示:
bool res = System.Net.WebRequest.RegisterPrefix ("http", new MyHttpRequestCreator ());
Debug.Assert (res == false);
这种断言有时会通过。。。有时候不是!
(如果同一前缀的创建者已经注册,RegisterPrefix返回“false”;我希望它总是返回false,但事实并非如此!同样,它是完全随机的)
当注册“失败”(即返回false,因为“HTTP”前缀已注册)时,WebRequest可以创建HTTP请求。这就像调用RegisterPrefix“唤醒”静态构造函数并让它运行一样
我感到困惑:在WebRequest的静态构造函数的执行中,这似乎是一个竞争条件,但这没有意义(运行时使用锁IIRC保护静态构造函数)
我错过了什么?
我如何解决或解决这个问题?
是我的错(误解或遗漏了什么),还是它看起来像一个单声道bug,因此我应该提交它
详情:
单声道版本
Mono JIT编译器版本3.0.6(Debian 3.0.6+dfsg-1~exp1~pre1)
(可能是相关的,未回答的问题:)mono 3.0.6真的很旧了,请upgrade@knocte这个问题也有3年了;)不过我不知道它的状态,因为它是我的一个节目阻碍(不得不放弃它,换一种方式)哦,哇,你在这三年里找到了解决方案吗?你有没有和dotnetcore一起调查httpclient