2012-04-20 5 views
7

私はいくつかの従来のURLをサポートし、それらをコントローラアクションにマップしようとしています。特殊文字を使用したMVCルート

/~Home+Office~Note+Pads.html 

ここに私のルートです:私はブレークポイントを設定した場合

public class LegacyCIController : Controller { 
    public ActionResult Index(string path) { 
     if (path == "~Address+Labels") { 
      return RedirectToAction("Display", "Category", new { id = "AddressLabels" }); 
     }  
     return RedirectToAction("Index", "Category"); 
    } 
} 

routes.MapRoute(
    "LegacyCategory", 
    "{path}.html", 
    new { controller = "LegacyCI", action = "Index", } 
); 

は、ここでそれらに対処するために私のコントローラ(の始まり)ですURLは次のようになりLegacyCIControllerを起動し、開始ページをXXX.htmlに設定した場合、ブレークポイントがヒットし(そして失敗すると、ifに失敗します)、人生は良いです。しかし、開始ページを~Address+Labels.htmlに設定しようとすると、ブレークポイントは適用されず、Chromeは単にpukesを表示し、「このページは壊れているようです」というページを表示します。

私はVisual Studioではなく、私のマシン上でIIS 7を通してこのページを実行しています。

このURLは、通常のMVCルートでも処理できない形式であるか、間違っていますか?

+6

うわー、それはかなりジャックされたファイル名です。 – Tejs

+0

@Tejs - はい、そうです。レガシーのものを扱うことは、人生の本当の楽しさの1つです:) –

+0

私の理論は、IISが要求をバウンスされているということです。IIS7にはブラックリストに載っているURL文字セットがあると思います。 – Tejs

答えて

5

パスで+とデフォルトのIIS7ブロックのURL(エラー404.11)することで、あなたはweb.configallowDoubleEscapingをオンにすることでこれをオーバーライドすることができます。

<system.webServer> 
    <security> 
     <requestFiltering allowDoubleEscaping="true"> 
     </requestFiltering> 
    </security> 
    </system.webServer> 

をしかし、上で説明したようにIISのブログは、このオプションは、潜在的なセキュリティホールを開き、それを使用しているので、少し注意してください:

http://blogs.iis.net/thomad/archive/2007/12/17/iis7-rejecting-urls-containing.aspx

+0

もう一度ありがとう。それは完璧に働いた。 –

0

HandleUnknownActionを試してみてください。お使いのコントローラでは:

protected override void HandleUnknownAction(string actionName) { 
    if(Request.Path == "/~Address+Labels.html") { 
    RedirectToAction("Display", "Category").ExecuteResult(ControllerContext); 
    } else { 
    base.HandleUnknownAction(actionName); 
    } 
} 
関連する問題