4

現時点では、ServiceStack のルートで default.cshtml ビューを使用して、AngularJS シングルページ アプリを提供しています。

私がやりたいのは、html5 プッシュステートのサポートを有効にすることです (したがって、URL にハッシュはありません) が、これまでに見つけた唯一の例は、ワイルドカード ルートを使用して MVC に依存し、ServiceStack インフラストラクチャを / にプッシュすることです。 API サブルート。

MVC の依存関係を利用することはできないため、任意の URL を受け入れてルート アプリケーションを提供する必要がある accept:text/html リクエストが必要だと思います。デフォルトの HtmlFormat 拡張機能を削除するか、オーバーライドしていただければ幸いです (必要な JsonReport コンテンツ タイプを引き続き使用できます)。

どうすればこれに最もよくアプローチできますか?

4

2 に答える 2

5

Order of Operations wiki ページには、独自のカスタマイズされた動作を挿入するために利用できるさまざまなフックの数と、それらが実行される順序が示されています。

RawHttpHandlers によるハイジャック リクエスト

ハイジャックしたいリクエストに対してaConfig.RawHttpHandlersを返す a を追加することで、ServiceStack を完全にバイパスできます。IHttpHandlerssr-

config.RawHttpHandlers.Add((IHttpRequest request) => {
    var file = GetFileNameWithoutExtension(request.PathInfo);
    return file != null && file.StartsWith("ssr-")
        ? new MiniProfilerHandler()
        : null;
}

一致しないルートのフォールバック ハンドラーを提供する

一致しないルートのデフォルト ハンドラーを提供する場合は、CatchAllHandlersをプラグイン内AppHost.Configure()またはプラグイン内に登録できます。

appHost.CatchAllHandlers.Add((string method, string pathInfo, string filepath) =>
{
    return ShouldProvideDefaultPage(pathInfo) 
        ? new RazorHandler("/defaultpage.cshtml")
        : null;
});

ワイルドカードを使用してサービス内の任意の URL を受け入れる

ダミーのサービスを作成して、単純に同じ単一のビューを返すことができます。たとえば、次のようになります。

[Route("/app/{PathInfo*}")]
public class App {
    public string PathInfo { get; set; }
}

public class MyService : Service 
{
    public object Any(App request)
    {
        return request;
    }
}

ワイルドカードを使用すると、このサービスはビューを返します。たとえば/View/App.cshtml、 で始まる任意のルートで次のようになります/app

  • /アプリ
  • /アプリ/こんにちは
  • /app/hello/my/name/is?foo=bar

部分的なページのサポート

部分的なリロードは pushstate に関連しているため、部分的なリロードに対する ServiceStack の組み込みサポートについても言及します。

ServiceStack Docsは、pushstate をサポートするブラウザーで pushstate を使用するサンプル デモです。それ以外の場合は、サポートしていないブラウザーでフルページ リロードを使用するようにフォールバックします。

?format=text.bareたとえば、paramを使用して部分ページを要求できます。

これはMarkdown Razorを使用していますが。最新の ServiceStack.Razor サポートでは、次の方法で部分ページにアクセスできます。?format=bare

于 2013-05-22T23:19:07.233 に答える
1

私のコメントを拡張します。これは、仮想ファイル システムもサポートしながら、/app でアプリケーションをホストしようとした結果です。

host.CatchAllHandlers.Add((string method, string pathInfo, string filepath) =>
{
    if (!Regex.IsMatch(pathInfo, "^/app([/?]|$)"))
        return null;

    // Serve valid requests as is
    var vFile = HostContext.ResolveVirtualFile(pathInfo, null);
    if (vFile != null)
        return null;

    var vDir = HostContext.ResolveVirtualDirectory(pathInfo, null);
    if (vDir != null && vDir.GetDefaultDocument() != null)
        return null;

    // Fallback to default document
    var vDef = HostContext.ResolveVirtualDirectory("/app/", null).GetDefaultDocument();
    return new CustomResponseHandler((req, res) =>
        new HttpResult(vDef.OpenRead(), MimeTypes.GetMimeType(vDef.Name)));
});
于 2015-05-21T16:28:41.897 に答える