私はWebRequest
WebServiceStack
アプリケーション (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/webRequestModules
web.config
HttpRequestCreator
さらに奇妙なことに、次のように 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)
おそらく関連する未回答の質問: