89

WebRequestServiceStackWeb 应用程序(由 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 源 ,似乎前缀是从类静态构造函数中的配置添加的(这不是一个好的选择,恕我直言,但仍然......它应该可以工作)。

为了测试它,我尝试HttpRequestCreatorsystem.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)

可能相关但未回答的问题:

4

0 回答 0