2012-04-20 18 views
7

Bazı eski URL'leri desteklemeye çalışıyorum ve bunları denetleyici eylemleriyle eşleştiriyorum. URL'ler şuna benzer: my kontrolör onlarla başaÖzel karakterlerle MVC yolları

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

(başlangıcı) var:

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

Ben bir kesme noktası ayarlarsanız İşte

/~Home+Office~Note+Pads.html 

benim rota var LegacyCIController ve başlangıç ​​sayfamı XXX.html olarak ayarlıyorum, kesme noktası isabetleri (ve if başarısız olur) ve hayat iyi. Ancak, başlangıç ​​sayfasını ~Address+Labels.html olarak ayarlamaya çalıştığımda, herhangi bir kesme noktası vurulmuyor ve Chrome sadece "kusurlar, bu sayfa bozuk görünüyor" yazan bir sayfa gösteriyor.

Bu sayfayı, Visual Studio'dan değil, makinemdeki IIS 7 aracılığıyla çalıştırıyorum.

Bu URL, normal bir MVC yolunun bile işleyemediğinden hatalı mı yoksa yanlış bir şey mi yapıyorum?

+6

Vay, bu oldukça kulağa bir dosya adı. – Tejs

+0

@Tejs - evet, evet öyle. Eski şeylerle uğraşmak hayatın gerçek sevinçlerinden biridir :) –

+0

Teorim, IIS'nin isteği geri döndürdüğü - IIS7'nin kara listeye alınmış bir URL karakter kümesi olduğunu düşünüyorum. – Tejs

cevap

5

yolunda bir + ile varsayılan IIS7 blokları URL'ler (hata 404,11) ederek, web.config içinde allowDoubleEscaping açarak bu geçersiz kılabilirsiniz:

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

Ancak, açıklanan şekilde bunu kullanırken bu seçenek potansiyel bir güvenlik deliği açılır IIS günlüğü, bu yüzden biraz dikkatli olun:

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

+0

Tekrar teşekkürler. Bu mükemmel çalıştı. –

0

HandleUnknownAction kullanmayı deneyin. senin denetleyicisi:

protected override void HandleUnknownAction(string actionName) { 
    if(Request.Path == "/~Address+Labels.html") { 
    RedirectToAction("Display", "Category").ExecuteResult(ControllerContext); 
    } else { 
    base.HandleUnknownAction(actionName); 
    } 
} 
İlgili konular