8

内部 Web サーバーを持つアプリケーションを .NET 2.0 から .NET 4.0 にアップグレードしています。

クラスHttpListenerWorkerRequestを拡張し、 の形式で Url を返すリクエストを作成する object でリクエストを処理しています。HttpWorkerRequestGetRawUrl()http://localhost:82/Default.aspx

.NET 2.0 では、これを問題なく送信HttpRuntime.ProcessRequest(httpListenerWorkerRequest)できますが、.NET 4.0 では、「Bad Request」というテキストしかない Web ページが表示されます。

open をクラックすると、HttpContext を構築しようとするプライベート メソッドであるHttpRuntimeから Bad Requests がスローされていることがわかります。ProcessRequestInternal(HttpWorkerRequest wr)

私はこれを自分で試しました:

try
{
    //what's going on?
    hcontext = new HttpContext(workerRequest);
}
catch(Exception e)
{
    //Debugging break point here
}

更新前 (.NET 2.0)、正常にビルドされ、更新後 (.NET 4.0)、それを示す System.ArgumentException が発生します。

The relative virtual path 'http:/localhost:82/Default.aspx' is not allowed here、投げられる

at System.Web.VirtualPath.Create(String virtualPath, VirtualPathOptions options)
   at System.Web.HttpRequest.get_ClientFilePath()
   at System.Web.Security.CookielessHelperClass.RemoveCookielessValuesFromPath()
   at System.Web.HttpContext.Init(HttpRequest request, HttpResponse response)
   at System.Web.HttpContext..ctor(HttpWorkerRequest wr)
   at Talcasoft.Web.Hosting.HttpWorkerThread.Run(Object request) in      
   C:\[OurLibrary].Web\Hosting\HttpWorkerThread.cs:line 51

これを引き起こす .NET の変更点と、これを回避するにはどうすればよいですか?

編集リクエストの GetRawUrl() は確かに double を返しますが、許可されていない http: の後に double ではなく単一のスラッシュが続くことに気付きました。

4

2 に答える 2

7

これが「正確な答え」であると 100% 確信しているわけではありませんが、私にはかなり近いように見えます。

breaking changeクラス内に一種の があるようですVirtualPath- そしてそれは彼らがどのようにチェックしているかで実証されていますillegal characters. (ところで、「VirtualPathソース」をグーグルで検索して、.NET 4バージョンと思われるものを見つけることができます)。

VirtualPath.Create「無効な仮想パス文字」に対して 内部チェックが呼び出されます。

最初にレジストリ (" HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET "、" VerificationCompatibility ") に入り、compatibilityモード 'illegal chars' を使用する必要があるかどうかを確認します。

それに基づいて-私は推測しています(現在これを確認する方法はありません)-上記 のレジストリ値(int)をに設定すると1、メソッドが機能the old wayし、追加の労力は必要ありません。注:リンクの 1 つに 示されているように、IIS (またはホスト プロセス) の再起動が必要になる場合があります。

そして、そのレジストリフラグに基づいて、これら2つのいずれかを使用しました...

':', '?', '*', '\0' // .NET 4.0 - the default
'\0' // the 'compatibility' mode  

illegal「ポート」指定のパスは実際には新しいデフォルトに従って いるため、それは実際にあなたのストーリーを非常によく説明しているようです。


最終編集/説明:

(コメントとそれを解決した解決策に基づいて更新)
これは、内部で何が起こっているかについての私の理解です:

1) .NET 4.0 より前のソリューションがVerificationCompatibility重要でした (上記参照)。

2) .NET 4.0 では、URL パスの内部処理と修正がより堅牢になります。ほとんどの場合、正常に動作します。要するに、すべてのパスは - に入る前に修正および正規化VirtualPath.Createhttp://...、期待される絶対パスになります/Default.aspx

ただし、HttpWorkerRequest(リクエスト/レスポンスなどの代わりに) を指定すると、raw Urlは から直接取得され、正しい正規workerされたパスを指定する責任はワーカー request に委ねられます。(これはまだ少し不確かで、バグまたは内部での不適切な処理のように見えます)。

問題を再現するには:

internal class MyRequest : SimpleWorkerRequest
{
    public MyRequest() : base("", "", String.Empty, String.Empty, null) { }
    public override String GetRawUrl() { return "http://localhost:82/Default.aspx"; }
}
// ...
var wr = new MyRequest();
var context1 = new HttpContext(wr);

エラーを与えるThe relative virtual path 'http:/localhost:82/Default.aspx' is not allowed here.

修正:

public override String GetRawUrl() 
{ return new Uri(url, UriKind.RelativeOrAbsolute).AbsolutePath; }


VerificationCompatibilityそして、それへの鍵と思われるレジストリの そのキーワードに基づいた主題に関する研究のいくつか。

URL ファイル名のアンパサンド = 不正なリクエスト

特殊文字を含む URL を受け入れるように IIS を構成します...

レジストリの 32 対 64 の違いについて

そして、これはマイクロソフトからの同様のものです-しかし、「2.0」の「ホットフィックス」のように見えるもの、つまりあなたには適用されません-しかし、この行に公式なものとして添付するだけです.

修正: .NET Framework 1.1 の「HTTP 400 - 無効な要求」エラー メッセージ
修正: ASP.NET 2.0 ベースの Web ページにアクセスしようとすると、エラー メッセージ:「HttpException (0x80004005): '/HandlerTest/WebForm1.aspx/ a:b' は有効な仮想パスではありません"
ASP.NET 2.0 x64 – KB 932552 または 826437 に記載されているように、HTTP 400 Bad Request または Error が発生する場合があります。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET

DWord 値の名前: VerificationCompatibility 値のデータ: 1

于 2013-04-22T01:36:41.797 に答える