我WebRequest
在ServiceStack
Web 应用程序(由 Mono 上的 XSP 托管)中遇到了一个非常奇怪的问题。似乎请求模块的注册以一种非常奇怪的方式工作;我正在使用WebRequest
创建一个 HTTP 请求,但它失败了,因为它无法找到该“前缀”(HTTP)的创建者。
我看到的例外是NotSupportedException
,我能够追踪到没有为 HTTP 前缀注册创建者的事实(我正在点击https://github.com/mono/mono/blob/master/mcs/class/ System/System.Net/WebRequest.cs,大约第 479 行)
编辑:更多详细信息:NotSupportedException
由 抛出WebRequest.GetCreator
,它使用 URL 前缀作为键来选择要返回的创建者;就我而言,一个HttpRequestCreator
. 抛出异常是因为没有为“HTTP”前缀注册的创建者(实际上,根本没有创建者)。
所以我搜索了一下,挖掘了 Mono 源代码,发现模块已(或应该)添加到各种*.config文件之一的webRequestModules
部分。system.web
我查看了我的machine.config文件,它是:
System.Net.HttpRequestCreator, System, Version=4.0.0.0
查看WebRequest Mono 源 ,似乎前缀是从类静态构造函数中的配置添加的(这不是一个好的选择,恕我直言,但仍然......它应该可以工作)。
为了测试它,我尝试HttpRequestCreator
在system.net/webRequestModules
我的web.config
; 这由 XSP/Mono 加载并导致重复键异常(这是预期的,因为HttpRequestCreator
应该已经加载,因为它已经存在于machine.config中)。
更奇怪的是:如果我为 Http 添加一个模拟处理程序,如下所示:
bool res = System.Net.WebRequest.RegisterPrefix ("http", new MyHttpRequestCreator ());
Debug.Assert (res == false);
断言有时会通过……有时不会!(RegisterPrefix
如果已经注册了相同前缀的创建者,则返回“false”;我希望它总是返回 false,但事实并非如此!再次,它是完全随机的)
当注册“失败”时(即,因为已经注册了“HTTP”前缀而返回 false),则WebRequest
可以创建 HTTP 请求。就好像调用RegisterPrefix
“唤醒”静态构造函数并让它运行一样。
我很困惑:在执行的静态构造函数中似乎是一个竞争条件WebRequest
,但这没有意义(运行时用锁保护静态构造函数,IIRC)
我错过了什么?我该如何解决或解决这个问题?是我的错(误解或遗漏了什么),还是它看起来像 Mono 错误,所以我应该提交它吗?
细节:
mono --version
Mono JIT 编译器版本 3.0.6 (Debian 3.0.6+dfsg-1~exp1~pre1)
可能相关但未回答的问题: