1

mono で実行されている ASP MVC アプリケーションでは、WebRequest の作成時に NotSupportedException: http が発生することがあります。スタックトレースは次のとおりです。

979: Message: System.NotSupportedException: http
980:  at System.Net.WebRequest.GetCreator (System.String prefix) [0x00000] in <filename unknown>:0 
981:  at System.Net.WebRequest.CreateDefault (System.Uri requestUri) [0x00000] in <filename unknown>:0 


Version Information: 3.0.12 (master/b39c829 Tue Jun 18 11:23:32 CEST 2013); ASP.NET Version: 4.0.30319.17020

https://github.com/mono/mono/blob/master/mcs/class/System/System.Net/WebRequest.cs#L479

うまくいくこともあれば、うまくいかないこともあります。理由がわかりませんでした。誰かがこの問題を解決しましたか?

4

2 に答える 2

2

これは、Mono 2.10 の以前のバージョン (実際には数年前) のいくつかで見られ、追跡するのに役立ちました (しかし、しばらく前に見たことはありません)。

メモリに問題がなければ、ASP.Net のスタートアップ パスの競合状態か、ASP.Net が使用していた同期プリミティブのバグです。

それを追跡するのは非常に困難でした。これは (もちろん) 運用サーバーでのみ発生し、散発的にしか発生しませんでした。

私の場合、ASP.Net の再起動後にのみ発生しました。サーバーに定期的に接続するボットがありましたが、サーバーがしばらくダウンしていた場合、多くのボットがサーバーが戻ったときに心配そうにサーバーをドキドキさせ、明らかに競合状態をトリガーしやすくしていました。

絞り込むために、ソースから Mono をビルドし、Console.WriteLine ステートメントを追加しました。しばらくして (実際には数週間、Console.WriteLines を追加すると再現が難しくなったため)、犯人が見つかりました。残念ながら、何が問題だったのか、修正されたのか正確には覚えていません。

うまくいけば、これはあなたがそれを追跡するのに役立ちます.

于 2013-07-24T12:34:08.760 に答える
2

これは、アプリケーションでこの問題を解決するために使用したハックです。

private static HttpWebRequest CreateWebRequest(Uri uri)
    {
        //Webrequest creation does fail on MONO randomly when using WebRequest.Create
        //the issue occurs in the GetCreator method here: http://www.oschina.net/code/explore/mono-2.8.1/mcs/class/System/System.Net/WebRequest.cs

        var type = Type.GetType("System.Net.HttpRequestCreator, System, Version=4.0.0.0,Culture=neutral, PublicKeyToken=b77a5c561934e089");
        var creator = Activator.CreateInstance(type,nonPublic:true) as IWebRequestCreate;
        return creator.Create(uri) as HttpWebRequest;
    }
于 2013-08-01T14:56:58.933 に答える