本机代码与托管代码
IIS 将使用本机代码来提供静态文件,并且可能会采用一些积极的内存缓存来实现其性能。
由于 ServiceStack 是一个 .NET 库,其代码直接写入 ASP.NET 的响应流,因此在托管 .NET 代码中流式传输文件时更难获得更快的速度。您可以通过将文件加载到内存中并改为写入原始字节来进一步提高性能。
利用 HTTP 缓存
这就是为什么如果您必须使用托管代码,您应该尽最大努力利用 HTTP 缓存,这是我们在StaticFileHandler中所做的- 即 ServiceStack 用于提供其静态内容的内容,例如 css/js/html 页面。
注册一个原始 HttpHandler
尽管 ServiceStack 的请求管道已经过高度优化(即不会增加太多开销),但您仍然可以通过注册自己的自定义来绕过它并自己IHttpHandler
处理原始 ASP.NET 请求 - 这将是 .NET 代码中最快的选项,例如:
SetConfig(new EndpointHostConfig {
RawHttpHandlers = { MiniProfilerHandler.MatchesRequest },
});
这就是内置 MiniProfiler 用来提供其静态内容的内容。MatchesRequest只需要计算IHttpRequest
它是否应该处理请求(通过返回 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 更好的原始吞吐量。