2013-07-23 2 views
2

У меня есть запасной вариант DTO, который выглядит следующим образом: ServiceStack - Перенаправление в корне на основе запроса Params

[FallbackRoute("/{Path*}")] 
public class Fallback 
{ 
    public string Path { get; set; } 
} 

Теперь в моей службы я хотел бы перенаправить к совместимому URL HTML5 , и это то, что я пробовал:

public object Get(Fallback fallback) 
{ 
    return this.Redirect("/#!/" + fallback.Path); 
} 

Он работает все прекрасно и денди, за исключением того, что параметры запроса не передаются вместе с пути, за исключением. Использование Request.QueryString не работает, так как независимо от того, что я делаю, оно пусто. Вот что мое текущее решение (нерабочий) выглядит следующим образом:

public object Get(Fallback fallback) 
{ 
    StringBuilder sb = new StringBuilder("?"); 
    foreach (KeyValuePair<string, string> item in Request.QueryString) 
    { 
     sb.Append(item.Key).Append("=").Append(item.Value).Append("&"); 
    } 
    var s = "/#!/" + fallback.Path + sb.ToString(); 
    return this.Redirect(s); 
} 

TL; DR: Я хочу передать строки запроса вместе с запасным путем.

EDIT: Оказалось, что у меня две проблемы; теперь собирается mysite.com/url/that/does/not/exist?random=param правильно перенаправляет запрос на mysite.com/#!/url/that/does/not/exist?random=param& после того как я изменил выше цикл для:

foreach (string key in Request.QueryString) 
{ 
    sb.Append(key).Append("=").Append(Request.QueryString[key]).Append("&"); 
} 

Но Запасной вариант еще не вызывается в корне, то есть mysite.com/?random=param ничего не сработает.

В сущности, я хочу, чтобы ServiceStack просматривал строки запросов в корне, например, mysite.com/?key=value, применял некоторую логику, а затем запускал перенаправление. Цель этого заключается в том, чтобы роботы-искатели могли запрашивать сайт с параметром _escaped_fragment_, а затем представляли снимок HTML, подготовленный сервером. Это необходимо для того, чтобы боты могли индексировать одностраничные приложения (more on this).

Я думаю, что функция FallbackRoute не будет охватывать это, и мне нужно прибегнуть к переопределению CatchAllHandler.

ответ

3

Мне удалось найти решение благодаря this answer. Сначала создайте EndpointHostConfig объект в AppHost:

var config = new EndpointHostConfig 
{ 
    ... 
}; 

Затем добавьте RawHttpHandler:

config.RawHttpHandlers.Add(r => 
{ 
    var crawl = r.QueryString["_escaped_fragment_"]; 
    if (crawl != null) 
    { 
     HttpContext.Current.RewritePath("/location_of_snapshots/" + crawl); 
    } 
    return null; 
}); 

Переход к mysite.com/?_escaped_fragment_=home?key=value будет выстрелить редирект mysite.com/location_of_snapshots/home?key=value, который должен удовлетворять AJAX ползающих роботов.

N.B. Возможно, какая-то логика должна быть применена к перенаправлению, чтобы не было двойной косой черты. Мне еще предстоит проверить это.

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