53

ASP .NET MVC ベータ版を使用していますが、末尾に「ドット」がある次の URL を使用すると、HTTP 404 (リソースが見つかりません) エラーが発生します。

http://localhost:81/Title/Edit/Code1 .

最後にドットを削除するか、ドットが途中にある場合、エラーは発生しません。

デバッグしようとしましたが、MvcHandler の ProcessRequest の前に "System.Web.CachedPathData.GetConfigPathData(String configPath)" からエラーが発生しました。

URL の末尾に「ドット」を使用することはできませんか? または、この URL を処理するようにルート定義を修正する方法はありますか?


例: Detail1 [Id(integer), Code(string), Description(string)] という名前のテーブルがあり、ID 列を介して Master1 との FK 関係があります。Master1 のレコードを選択するたびに、その Detail1 レコードも選択して Code フィールドを取得します。毎回この結合を作成しないようにするために (通常、Detail は 1 つだけではなく、複数あるため)、Id 列を使用しないことを選択し、Detail1 の Code PK を作成します。

しかし、Id を取り除き、Code を PK として使用すると、ルートも Code フィールドで動作し始めます。例: Detail1\Edit\Code1

このコードには、DOT を含め、その中または最後に何でも含めることができます。最後に DOT を禁止できる場合もありますが、非常に意味のある場合もあります。

また、ルートが非常に柔軟であるというこの投稿も見たので、私のルートがそれほど変だとは思いませんでした。

だからこそ、私は非常に非標準的なことをします。助言がありますか?

また、URL の末尾に DOT があるのはなぜおかしいのでしょうか?

4

6 に答える 6

54

.NET 4.0 を使用している場合は、web.config の system.web セクションでこのフラグを設定すると、許可されます。

<httpRuntime relaxedUrlToFileSystemMapping="true" />

私はそれをテストしましたが、動作します。Haackに説明があります。

于 2010-08-22T17:37:04.377 に答える
17

これは、1.0 以降のすべての ASP.NET バージョンでいくつかの方法で解決できます。このスレッドが作成されてから 2 年が経過していることはわかっていますが、とにかく、次のようになります。

原因

カスタム エラー ハンドラーを作成したり、404 をリダイレクトするために IIS でカスタム ページを構成したりしても機能しません。これは、ASP.NET がこの URL を危険と見なしているためです。の内部でSystem.Web.Util.FileUtil、ASP.NET はプライベート メソッドIsSuspiciousPhysicalPathを呼び出します。このメソッドは、パスを (仮想だが正当な) ファイル名にマップしようとします。

結果の正規化されたパスが元のパスと等しくない場合、処理は停止し、ASP.NET コードは 404 を返します (IIS または web.config にカスタム 404 を要求するのではなく、それ自体を返すため、そのようになります)。これについて何かをするのは難しい)。

Windows エクスプローラーも同じように機能します。1 つまたは複数のドットで終わるファイル名を作成してみてくださいtest.txt.。結果の名前はtext.txt.

ASP.NET で URL をドットで終了するためのソリューション

解決策は簡単です (一度理解すれば、常にそうです)。この 404 を送信する直前に、 (または VB に相当する)Application_PreSendRequestHeadersに登録できる単純なイベントであるを呼び出します。Global.asax.cs次のコードは単純なテキストをブラウザに返しますが、リダイレクトやその他の有効な応答も可能です。

protected void Application_PreSendRequestHeaders(object sender, EventArgs e)
{

    HttpResponse response = this.Context.Response;
    HttpRequest request = this.Context.Request;
    if (request.RawUrl.EndsWith("."))
    {
        response.ClearContent();
        response.StatusCode = 200;
        response.StatusDescription = "OK";
        response.SuppressContent = false;
        response.ContentType = "text/plain";
        response.Write("You have dot at the end of the url, this is allowed, but not by ASP.NET, but I caught you!");
        response.End();
    }
}

注: このコードは、"aspx" がURL の一部でない場合にも機能します。つまり、http://example.com/app/somepathです。そのイベントを呼び出します。また、一部のパスはまだ機能しないことに注意してください (たとえば、複数のドット、ハッシュタグ、または < 記号で終わると、400-Bad Request が発生します)。繰り返しますが、引用符、スペースとスラッシュ、またはスペースで区切られた複数のドットで終わる場合は機能します。

于 2011-03-11T12:34:04.947 に答える
6

さて、.NET 4.5 では、URL の末尾に「/」を追加することでこの問題を修正しました。

したがって、あなたの場合は「http://localhost:81/Title/Edit/Code1./」になります。私がしたのはそれだけで、httpRuntime設定を追加する必要はありませんでした。

于 2012-11-15T12:18:27.793 に答える
2

これをハンドラに追加します

  <add name="ExtensionlessUrlHandler-Integrated-4.0-ForApi"
 path="api/*"
 verb="*"
 type="System.Web.Handlers.TransferRequestHandler"
 preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
于 2016-12-15T13:19:43.907 に答える
-1

おそらくhttp://localhost:81/Title/Edit/Code1%2Eうまくいくでしょう。

16 進数の ASCII コードでピリオドをエスケープしました。

于 2009-01-10T15:48:46.007 に答える
-3

ドットで終わる URI を使用できないのはなぜですか?

URI はリソース要求であり、関連するすべてのオペレーティング システムには、ドット文字が拡張子の区切り文字であるという歴史的な命令が存在するためです。最後のドットはファイル拡張子を示すものとして扱われるため、ドットで終了しても意味がありません。

また読む価値があります:

于 2009-01-10T17:04:14.920 に答える