2015-01-31 5 views
8

У меня возникла проблема с перезаписи URL-адресов, которая работает в Global.asax, но не в промежуточном программном обеспечении OWIN.URL-адрес перезаписи в промежуточном программном обеспечении OWIN

Global.asax код

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 код промежуточного слоя (используется для обнаружения культуры, кода укороченной для краткости)

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); 
    } 
} 

я ожидаю, что "Global" действие контроллера "Home" получает но вместо этого вызывается действие по умолчанию «Индекс».

После того, как путь изменяется context.Request.Uri.AbsoluteUri является http://localhost/Global/Home

Но контроллера Request.Url.AbsoluteUri еще http://localhost

Я даже пытался context.Environment["owin.RequestPath"] = "/Home/Global"; но Безразлично, кажется, работает.

Прежде чем кто-нибудь спросит, да, я вызываю IAppBuilder.Use(typeof(GlobalizationMiddleware)) в Startup.cs, и отладчик вводит метод Invoke.

Что я делаю неправильно?

EDIT

Я даже попытался ссылки System.Web, а затем делать это ... не работает, либо :(

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"); 

EDIT 2 - Нашел рабочий раствор (см ниже), но Я не уверен, что это правильное решение, комментарии будут оценены :)

+0

Зачем вам нужно переписать, и почему IIS Url Rewriter не работает для вашей ситуации? –

+0

IIS Url Rewriter может работать для моего прецедента, я не уверен ... Я просто утонул в этой проблеме, поэтому я разместил его, надеюсь, это не проблема :) Моим вариантом использования является то, что у меня есть несколько доменов, указывающих на мой сайт (каждый домен имеет другую конфигурацию бизнес-логики) и один домен «каталог», который представляет собой список ссылок на эти доступные домены. Если я получаю доступ к домену, который больше не указан или домен не передает различные бизнес-утверждения о его конфигурации, я хочу вместо этого отобразить домен «каталог» ... который представляет собой просто другое представление с разным расположением. – Mirek

ответ

4

Я нашел рабочее решение.

К сожалению, мне нужно было включить System.Web. Я напрямую изменяю объект RouteData в RequestContext.

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"; 

Но это чувствует себя слишком Hacky на мой вкус ... Я не уверен, если это правильное решение, так что я не буду принимать это как действительный ответ, может быть, кто-то придет с лучшим решением.

Смежные вопросы