servicestack,xsp,Mono,Httpwebrequest,servicestack,Xsp" /> servicestack,xsp,Mono,Httpwebrequest,servicestack,Xsp" />

Mono中使用WebRequest的问题

Mono中使用WebRequest的问题,mono,httpwebrequest,servicestack,xsp,Mono,Httpwebrequest,servicestack,Xsp,我在ServiceStack web应用程序(由Mono上的XSP托管)中遇到了一个非常奇怪的WebRequest问题。 请求模块的注册似乎以一种非常奇怪的方式工作;我正在使用WebRequest创建一个HTTP请求,但它失败了,因为它无法找到该“前缀”(HTTP)的创建者 我看到的异常是NotSupportedException,我能够跟踪到没有为HTTP前缀注册创建者这一事实(我正在点击,大约第479行) 编辑:更多详细信息:NotSupportedException由WebRequest.

我在ServiceStack web应用程序(由Mono上的XSP托管)中遇到了一个非常奇怪的WebRequest问题。 请求模块的注册似乎以一种非常奇怪的方式工作;我正在使用WebRequest创建一个HTTP请求,但它失败了,因为它无法找到该“前缀”(HTTP)的创建者

我看到的异常是
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