3

WebサービスAPIにサービススタックを使用しています。サーバー側の認証ロジックが必要なため、IISにファイルを直接提供させるのではなく、ファイルをフェッチするための「ファイルの取得」ルーチンを作成しました。

を返すことでファイルを返しますRestServiceBase<Foo>.OnGetIStreamWriterこれは次のように実装されます。

public void WriteTo(Stream responseStream)
{
    Stream filedata = File.OpenRead(_filepath);
    filedata.CopyTo(responseStream);
}

問題:これは、ファイルを直接提供するIISよりも約50%から100%遅くなります。

サービススタックからファイルを誤って返していますか?これをスピードアップするために私にできることはありますか?


または、認証スキーム(完全にステートレスにしたいので、サーバーマシンに資格情報をキャッシュしない)をIISにプラグインして、IISが何らかの方法でサーバーを呼び出して各要求を認証し、ファイル自体を提供できるようにする方法はありますか? ?

4

2 に答える 2

2

ネイティブ コードとマネージド コード

IIS は、ネイティブ コードを使用して静的ファイルを提供し、そのパフォーマンスを達成するために積極的なメモリ内キャッシュを使用する可能性があります。

ServiceStack は、コードが ASP.NET の応答ストリームに直接書き込む .NET ライブラリであるため、マネージ .NET コードでファイルをストリーミングする際に高速化することは困難です。ファイルをメモリにロードし、代わりに raw バイトを書き込むことで、パフォーマンスをさらに向上させることができます。

HTTP キャッシングを利用する

そのため、コードを管理する必要がある場合は、StaticFileHandlerで行っている HTTP キャッシング(つまり、ServiceStack が css/js/html ページなどの静的コンテンツを提供するために使用するもの) を利用するために最善を尽くす必要があります。

生の HttpHandler を登録する

ServiceStack のリクエスト パイプラインは高度に最適化されていますが (つまり、オーバーヘッドがあまり追加されません)、独自のカスタムIHttpHandlerを登録することでそれをバイパスし、生の ASP.NET リクエストを自分で処理することができます。これは、.NET コードで最速のオプションとなります。 :

SetConfig(new EndpointHostConfig { 
    RawHttpHandlers = { MiniProfilerHandler.MatchesRequest },
});

これは、組み込みの MiniProfiler が静的コンテンツを提供するために使用するものです。MatchesRequestIHttpRequest、リクエストを処理する必要があるか (IHttpHandler のインスタンスを返すことにより)、処理しないか (null を返す) を処理するだけです。

public static IHttpHandler MatchesRequest(IHttpRequest request)
{
    var file = Path.GetFileNameWithoutExtension(request.PathInfo);
    return file != null && file.StartsWith("ss-") 
        ? new MiniProfilerHandler()
        : null;
}

それ以外では、ServiceStack のスタンドアロン バージョン (つまり、HttpListener ホスト) は、ASP.NET よりも優れた生のスループットを提供するはずです。

于 2012-08-07T21:20:33.373 に答える
0

CLR スレッド プールのスレッドへの IIS I/O スレッドのコンテキスト スイッチにはペナルティがあります。(asp 構成) MaxConcurrentRequestsPerCPU を 0 に設定すると、CLR コードを軽減できるはずです (他の影響がある可能性があります)。けれど)

http://blogs.msdn.com/b/tmarq/archive/2007/07/21/asp-net-thread-usage-on-iis-7-0-and-6-0.aspxを参照してください 。

Windows で「ゼロ コピー」が許可されているかどうかはわかりません: ファイルを実行します (カーネル モードを離れることはなく、ソケットのバッファーをスキップしてファイル ハンドル操作を行います)。モード..)

于 2012-08-08T10:07:46.643 に答える