2

我有一个后备 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("&");
}

但是后备仍然没有被根调用,这意味着mysite.com/?random=param不会触发任何东西。

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

我在想也许 FallbackRoute 功能不会涵盖这一点,我需要求助于覆盖CatchAllHandler.

4

1 回答 1

3

由于这个答案,我设法找到了解决方案。首先在你的创建一个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;
});

Going tomysite.com/?_escaped_fragment_=home?key=value将触发对 的重定向mysite.com/location_of_snapshots/home?key=value,这应该满足 AJAX 爬行机器人的要求。

NB可能需要对重定向应用一些逻辑,以确保不会出现双斜杠。我还没有测试过。

于 2013-07-23T15:42:06.200 回答