0

次の問題に直面しました。誰かがこの奇妙な振る舞いを見つけたのかもしれません。

global.asax.cs に次のルート定義があります。

routes.Add(new Route("/module/{searchTerm}", new RouteValueDictionary { {"controller", "Module"}, {"action", "Index"} }, null, new MvcRouteHandler()));

したがって、最初の観点からは特別なことではありませんが、検索語にスペースが+記号として表示されると問題が発生します。

たとえば、リンクを開こうとします。

http://[myserver]/module/some%20search%20term

この場合、すべて問題なく、正しいアクションにリダイレクトされますが、リンクが次のようになっている場合:

http://[myserver]/module/some+search+term

提供された URL に一致するルートがないというエラーが表示されました。

ちなみに、ASP.NET 開発サーバーではこの問題を再現できません。IIS でのみ表示されます。おそらく誰かがそのような問題を抱えていましたか?

4

3 に答える 3

1
  • URL のパス セクションのパーセント エンコーディングはデコードされることが期待されますが、
  • パス コンポーネント内のすべての + 文字は、文字どおりに扱われることが期待されます。

明確に言うと、 + はクエリ コンポーネント内の特殊文字にすぎません。

RFC 1738 (2396 および 3986 によって変更) は、スキーム (http:)、権限 (//server.example.com)、およびパス (/myfile/mypage.htm) コンポーネントを定義し、 +キャラクター。

于 2013-03-08T12:50:41.950 に答える
0

+記号はセグメントの区切り文字です。スキーム、権限、パス、クエリのセグメント。

URIRFCから

2.2。予約文字

多くのURIには、特定の特殊文字で構成される、または特定の特殊文字で区切られたコンポーネントが含まれています。
これらの文字は、URIコンポーネント内での使用が予約された目的に制限されているため、「予約済み」と呼ばれます
。URIコンポーネントのデータが予約された目的と競合する場合は 、URIを形成する
前に、競合するデータをエスケープする必要があります。

  reserved    = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |
                "$" | ","


上記の「予約済み」構文クラスは、URI内で許可されているが、汎用URI構文の特定のコンポーネント内では許可されていない可能性のある文字を指します。
これらは、セクション3で説明されているコンポーネントの区切り文字として使用されます。

どうやら、これはカッシーニでうまく実装されていませんでした。

于 2013-03-11T10:29:30.197 に答える
0
  • IIS 設定で二重エスケープが禁止されている場合、URL のサインイン パス部分が機能しません。これは、リクエスト フィルタリング ポリシーの一部です。しかし、それは web.config で構成できます 二重エスケープを有効にするのは危険ですか?

web.config で有効にすると、すべて正常に動作し始めました。

于 2013-03-13T10:57:43.547 に答える