0

データベースに移動された画像の global.asax ファイルにルーティング テーブルを設定しました。EmpImages/[numeric id] のような URL を基本形式として使用する場合、同じ ~/EmpImages/42 の URL を使用すると問題なく動作しますが、~/EmpImages/42 である何百ものハードコーディングされたリンクがあります。 .png. EmpImages/[numeric id].png を使用しようとすると、ハンドラーが呼び出されません。

.ext を示すいくつかのサンプルを見てきましたが、ハンドラーの代わりにページ ルートを使用しています。以下のコードで、何が欠けているか教えていただけますか?

この部分は機能します:

RouteTable.Routes.Add(new Route("EmpImages/{id}/{size}", new EmployeeImageRouteHandler()));
RouteTable.Routes.Add(new Route("EmpImages/{id}", new EmployeeImageRouteHandler()));

URL を使用する場合:

~/EmpImages/42
~/EmpImages/42/256

しかし、私がしようとすると:

RouteTable.Routes.Add(new Route("EmpImages/{id}/{size}.png", new EmployeeImageRouteHandler()));
RouteTable.Routes.Add(new Route("EmpImages/{id}.png", new EmployeeImageRouteHandler()));

URL を使用する場合:

~/EmpImages/42.png
~/EmpImages/42/256.png

失敗します。ハンドラーが呼び出されることはありません。

私が見逃している簡単なことは何ですか?

4

3 に答える 3

1

Routeのドキュメントによると、ルートを指定する方法はサポートされていないようです。

ドキュメントの引用:

URL パターンは、HTTP 要求のアプリケーション名の後に続くセグメントで構成されています... 各セグメントは / 文字で区切られています。セグメントが中括弧 ( { および } ) で囲まれている場合、セグメントは URL パラメーターを参照します。ASP.NET ルーティングは要求から値を取得し、それを URL パラメーターに割り当てます... セグメントが中かっこで囲まれていない場合、値はリテラル値として扱われます。

どうやら、URL パラメータとリテラルが混在するセグメントはサポートされていないようです。

EmployeeImageRouteHandler で、サイズ パラメータの「.png」拡張子を文字列処理で内部的に処理する必要があります。

編集: この点に加えて、ドットを含む URL の処理に既知の問題があるようです。この StackOverflow の質問を参照してください。そこに提案されている解決策は、含めることです

<httpRuntime relaxedUrlToFileSystemMapping="true" />

ただし、これは ASP 4.0 および IIS 7.0 以降でのみ機能します。この問題の詳細は、示された質問に記載されているように、Haackedで説明されています。

于 2012-07-27T17:53:22.357 に答える
0

私の知る限り、上記の dmi_はルート解析の制限について正しいです。ただし、そこから簡単な回避策を引き出すことができます。

次のようにルートを登録します。

RouteTable.Routes.Add(new Route("EmpImages/{id}/{size}/i.png", new EmployeeImageRouteHandler()));
RouteTable.Routes.Add(new Route("EmpImages/{id}/i.png", new EmployeeImageRouteHandler()));

そしてそれらを要求します:

~/EmpImages/42/i.png
~/EmpImages/42/256/i.png
于 2012-07-27T18:37:41.230 に答える
0

問題は、ルーティングでキャッチしようとしているパスが静的リソースであることです。ルートの場所にファイルが存在する場合、ルーティングは無視されます。これは設計によるものであり、静的 URL 参照間の競合を防ぎ、ルーティング エンジンがすべてのリクエストに対して関与するのを防ぐためです。

ハンドラーにブレークポイントを配置してから、存在しないことがわかっている ID を指定して、これが当てはまるかどうかを確認してください。

于 2012-07-30T13:35:40.833 に答える