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:フォールバック パスと共にクエリ文字列を渡したい。

編集: 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.

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;
});

に移動mysite.com/?_escaped_fragment_=home?key=valueすると、 へのリダイレクトが開始されmysite.com/location_of_snapshots/home?key=value、AJAX クロール ボットを満足させるはずです。

注:リダイレクトにいくつかのロジックを適用して、スラッシュが二重にならないようにする必要がある可能性があります。私はまだそれをテストしていません。

于 2013-07-23T15:42:06.200 に答える