ServiceStack - 根据查询参数在根目录重定向

时间:2013-07-23 09:46:15

标签: servicestack single-page-application

<击> 我有一个Fallback DTO,如下所示:

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

现在,在我的服务中,我想重定向到符合HTML5的URL,这就是我尝试过的:

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:我想传递查询字符串以及回退路径。

编辑:事实证明我有两个问题;在我将上述循环更改为:

之后,现在转到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("&");
}

仍然没有在root用户调用回退,这意味着mysite.com/?random=param不会触发任何内容。

本质上,我想要做的是让ServiceStack在root查找查询字符串,例如mysite.com/?key=value,应用一些逻辑,然后触发重定向。这样做的目的是让爬虫机器人能够使用_escaped_fragment_参数查询站点,然后呈现由服务器准备的HTML快照。这是为了让机器人能够索引单页应用程序(more on this)。

我想也许FallbackRoute函数不会涵盖这个,我需要求助于覆盖CatchAllHandler

1 个答案:

答案 0 :(得分: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。可能需要将某些逻辑应用于重定向,以确保不会出现双正斜杠。我还没有测试过。