2015-01-31 26 views
8

Global.asax içinde çalışan ancak OWIN aracı yazılımında olmayan URL yeniden yazma konusunda bir sorunum var.OWIN ara katman yazılımında URL yeniden yazma

Global.asax kod

protected void Application_BeginRequest() 
{ 
    //Perfectly working rewrite. 
    //By route rules, this resolves to the action Global() 
    //of the HomeController 
    HttpContext.Current.RewritePath("Home/Global"); 
} 

Owin katman kod ben kontrolör "Ev" "Global" eylem alır bekliyoruz

public class GlobalizationMiddleware : OwinMiddleware 
{ 
    public GlobalizationMiddleware(OwinMiddleware next) 
     : base(next) 
    { } 

    public async override Task Invoke(IOwinContext context) 
    { 
     context.Request.Path = new PathString("/Home/Global"); 
     await Next.Invoke(context); 
    } 
} 

(kültür tespiti, kısalık için kısaltılmış kodu için kullanılır) denir ... ama bunun yerine, varsayılan eylem "Dizin" çağrılır. Yol context.Request.Uri.AbsoluteUri değiştirildikten sonra

http://localhost/Global/Home

olduğunu Ama Kontrolör en Request.Url.AbsoluteUri Hatta context.Environment["owin.RequestPath"] = "/Home/Global"; çalıştı ama o en ya çalışmıyor gibi görünüyor gelmez http://localhost

hala.

Kimse soran önce, Evet, Startup.cs içinde IAppBuilder.Use(typeof(GlobalizationMiddleware))'u arayın ve hata ayıklayıcı Invoke yöntemine girer.

Neyi yanlış yapıyorum?

DÜZENLEME

Hatta System.Web referans ve sonra bu ... çalışmıyor yapıyor çalıştı ya :(

System.Web.Routing.RequestContext requestContext = context.Environment["System.Web.Routing.RequestContext"] as System.Web.Routing.RequestContext; 
requestContext.HttpContext.RewritePath("/Home/Global"); 

System.Web.HttpContextBase contextBase = context.Environment["System.Web.HttpContextBase"] as System.Web.HttpContextBase; 
contextBase.RewritePath("/Home/Global"); 

DÜZENLEME 2 - çalışan bir solüsyon (aşağıya bakınız) Bulunan ancak Doğru çözüm olup olmadığı konusunda emin değilim, yorumlar takdir edilecektir :)

+0

Neden Rewrite'e ihtiyacınız var ve neden IIS Url Rewriter durumunuz için çalışmıyor? –

+0

IIS Url Rewriter kullanım durumum için işe yarayabilir, emin değilim ... Bu soruna boğuldum, bu yüzden yayınladım, umarım bu bir problem değildir :) Kullanım durumum, işaret eden birkaç alanım var Web sitem (her alanın farklı bir iş mantığı yapılandırması vardır) ve bir "dizin" alan adı, bu kullanılabilir alanlara ait bağlantıların bir listesi. Artık listelenmeyen bir alana erişirseniz veya etki alanı, yapılandırmasıyla ilgili çeşitli iş iddialarını iletmezse, bunun yerine, "dizin" etki alanını göstermek istiyorum. Bu, temel olarak yalnızca farklı düzende farklı bir görünümdür. – Mirek

cevap

4

Bir çalışma çözümü buldum.

Ne yazık ki, System.Web'i eklemeliydim. Doğrudan RequestContext'teki RouteData nesnesini değiştiriyorum. Bu yüzden geçerli bir cevap olarak bu kabul etmeyecektir doğru çözüm olup olmadığını

System.Web.Routing.RequestContext requestContext = context.Environment["System.Web.Routing.RequestContext"] as System.Web.Routing.RequestContext; 
requestContext.HttpContext.RewritePath("Home/Global"); 
requestContext.RouteData.Values["action"] = "Global"; 

Ama bu benim tatları çok hacky hissediyor ... Emin değilim, belki birisi daha iyi bir çözümle gelecek.

İlgili konular