2014-01-10 4 views
0

Я много искал, но не нашел никакого решения. Так вот мой случай:Динамическая внутренняя переадресация в ASP.NET MVC

У меня есть модель базы данных UrlRedirect

public class UrlRedirect : AuditInfo 
{ 
    [Key] 
    public int Id { get; set; } 

    public string OldUrl { get; set; } 

    public string NewUrl { get; set; } 
} 

Как вы можете предположить, что я пытаюсь сохранить отображение URL между OldUrl и NewUrl.

Я хочу внутренне изменить OldUrl путь запроса к NewUrl, а затем запустить все определенные маршруты, как они будут работать, если пользователь открывает NewUrl непосредственно.

Перенаправление должно быть на стороне сервера URL переписан и пользователь должен увидеть старый URL в браузере

+0

Какое «перенаправление» вы ожидаете? 301? 302? или просто на стороне сервера переписывать, что пользователь все еще видит старый URL-адрес в своем браузере? – tweray

+0

Я хочу, чтобы серверный URL-адрес переписывал, что пользователь по-прежнему видит старый URL-адрес в своем браузере :) –

+1

Как правило, это должно быть сделано с помощью маршрутизации в MVC, так как вы хотите перенаправить URL-адрес на URL-адрес, который может быть немного сложным, и, возможно, вам нужно изменить свой структура данных. Необработанным способом является HttpContext.Current.RewritePath() в Application_BeginRequest в Global.asax. Дайте мне знать, если вам нужен какой-то пример кода для любого способа. – tweray

ответ

1

Это мое окончательное решение, которое работает как шарм. Благодаря @WeTTTT за идею.

public class MvcApplication : HttpApplication 
{ 
    protected void Application_Start() 
    { 
     // ... 
    } 

    protected void Application_BeginRequest(object sender, EventArgs e) 
    { 
     this.ApplyCustomUrlRedirects(new UowData(), HttpContext.Current); 
    } 

    private void ApplyCustomUrlRedirects(IUowData data, HttpContext context) 
    { 
     var currentUrl = context.Request.Path; 
     var url = data.UrlRedirects.All().FirstOrDefault(x => x.OldUrl == currentUrl); 
     if (url != null) 
     { 
      context.RewritePath(url.NewUrl); 
     } 
    } 
} 
+0

Мне нужно было очень быстрое решение, и это работало, как чары! Благодаря! – Tillito

2

В Global.asax у вас есть какие-то события, которые выполняются в контексте веб-приложений. (для образца: Start_Application, End_Application и т. д.).

В вашем случае вы можете использовать событие BeginRequest, где выполняется каждый запрос к вашему веб-приложению. В этом случае вы можете проверить URL-адрес и попытаться перенаправить его, используя по умолчанию протоколы htpp, такие как код состояния 301 Moved Permanently. Для образца, в файле Global.asax добавьте код ниже:

protected void Application_BeginRequest(Object sender, EventArgs e) 
{ 
    // get the current url 
    string currentUrl = HttpContext.Current.Request.Url.ToString().ToLower(); 

    // here, you could create a method to get the UrlRedirect object by the OldUrl. 
    var urlRedirect = GetUrlRedirect(currentUrl); 

    // check if the urlRedirect object was found in dataBase or any where you save it 
    if (urlRedirect != null) 
    { 
     // redirect to new URL. 
     Response.Status = "301 Moved Permanently"; 
     Response.AddHeader("Location", urlRedirect.NewUrl); 
     Response.End(); 
    } 
} 

В образце, GetUrlRedirect(string) метод должен проверить его в базе данных, файл XML, кэш, или где вы сохраните объекты UrlRedirect.

Чтобы узнать больше о том, как работают жизненные циклы приложений ядра asp.net, читайте this article.

+0

Спасибо! Это очень близко к моему окончательному решению. –

1

Если вы действительно хотите, чтобы перенаправить на сервере, вы можете использовать один из следующих вариантов:

  • HttpServerUtility.TransferRequest
  • HttpServerUtility.Transfer
  • HttpServerUtility.Execute
  • HttpContext.RewritePath

Вы можете прочитать больше об этих вариантах, где аналогичные профи blem выставлен here.

Учитывайте влияние вашего выбора на производительность обслуживания запросов. ИМХО вы должны стараться использовать инфраструктуру MVC маршрутизации или просто вернуться к простым перенаправлениям (даже постоянным для скорости), поскольку [пользователь: 316799] написал, когда вы вычисляете новые URL-адреса на бизнес-уровне или на карте из db.

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