次のようなフォールバック 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:フォールバック パスと共にクエリ文字列を渡したい。
編集: 2つの問題があったことがわかりました。上記のループを次のように変更した後、リクエストを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
.