89

私はWebRequestWebServiceStackアプリケーション (Mono 上の XSP によってホストされている) で非常に奇妙な問題を抱えています。リクエスト モジュールの登録は、非常に奇妙な方法で機能しているようです。HTTP リクエストの作成に使用WebRequestしていますが、その「プレフィックス」(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ファイルの 1 つのwebRequestModulesセクションにモジュールが追加されている (または追加する必要がある) ことがわかりました。system.web

machine.configファイルを確認したところ、次のようになっています。

System.Net.HttpRequestCreator, System, Version=4.0.0.0

WebRequest Mono ソースを見ると 、クラスの静的コンストラクター内の構成からプレフィックスが追加されているようです (良い選択ではありませんが、私見ですが、それでも動作するはずです)。

テストするために、;HttpRequestCreatorに toを追加しようとしました。これは XSP/Mono によってロードされ、重複キー例外が発生します ( machine.configに既に存在するため、既にロードされているはずなので、これは予想されます)。system.net/webRequestModulesweb.configHttpRequestCreator

さらに奇妙なことに、次のように Http のモック ハンドラーを追加すると、次のようになります。

bool res = System.Net.WebRequest.RegisterPrefix ("http", new MyHttpRequestCreator ());
Debug.Assert (res == false);

アサーションは時々合格します...時にはそうではありません! (RegisterPrefix同じプレフィックスの作成者が既に登録されている場合は「false」を返します。常に false を返すと予想していますが、そうではありません! 繰り返しますが、完全にランダムです)

登録が「失敗」した場合 (つまり、「HTTP」プレフィックスが既に登録されているために false が返された場合)、 はWebRequestHTTP の要求を作成できます。これは、呼び出しRegisterPrefixによって静的コンストラクターが「ウェイクアップ」され、実行されるかのようです。

私は困惑しています: の静的コンストラクターの実行における競合状態のように見えますWebRequestが、これは意味がありません (ランタイムは静的コンストラクターをロック、IIRC で保護します)

私は何が欠けていますか?この問題を解決または回避するにはどうすればよいですか? それは私のせいですか (誤解または何かが不足しています)、それとも Mono のバグのように見えるので、提出する必要がありますか?

詳細:

mono --version
Mono JIT コンパイラ バージョン 3.0.6 (Debian 3.0.6+dfsg-1~exp1~pre1)

おそらく関連する未回答の質問:

4

0 に答える 0