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