servicestack,Authentication,Iis,servicestack" /> servicestack,Authentication,Iis,servicestack" />

Authentication 服务文件的服务堆栈与IIS中的性能

Authentication 服务文件的服务堆栈与IIS中的性能,authentication,iis,servicestack,Authentication,Iis,servicestack,我们将服务堆栈用于web服务API。我们编写了一个“获取文件”例程来获取文件,而不是让IIS直接为文件服务,因为我们需要服务器端身份验证逻辑 我们通过返回一个IStreamWriter,从RestServiceBase.OnGet返回一个文件,实现如下: public void WriteTo(Stream responseStream) { Stream filedata = File.OpenRead(_filepath); filedata.CopyTo(responseS

我们将服务堆栈用于web服务API。我们编写了一个“获取文件”例程来获取文件,而不是让IIS直接为文件服务,因为我们需要服务器端身份验证逻辑

我们通过返回一个
IStreamWriter
,从
RestServiceBase.OnGet
返回一个文件,实现如下:

public void WriteTo(Stream responseStream)
{
    Stream filedata = File.OpenRead(_filepath);
    filedata.CopyTo(responseStream);
}
问题:这比直接为文件提供服务的IIS慢50%到100%

我是否从服务堆栈返回的文件不正确?我能做些什么来加快速度吗


或者,是否有某种方法可以将我们的身份验证方案(我们希望完全无状态,因此服务器计算机上没有缓存凭据)插入IIS,以便IIS以某种方式调用我们的服务器对每个请求进行身份验证,然后为文件本身服务?

本机代码与托管代码 IIS将使用本机代码为静态文件提供服务,并可能采用一些积极的内存缓存来实现其性能

由于ServiceStack是一个.NET库,代码直接写入ASP.NET的响应流,因此在托管.NET代码中传输文件时很难更快。您可以通过将文件加载到内存并改为写入原始字节来进一步提高性能

利用HTTP缓存 这就是为什么如果您必须执行it托管代码,您应该尽最大努力利用HTTP缓存,这是我们在中所做的,即ServiceStack使用什么来服务其静态内容,例如css/js/html页面

注册原始HttpHandler 尽管ServiceStack的请求管道经过了大量优化(即不会增加太多开销),但您仍然可以通过注册自己的自定义
IHttpHandler
来绕过它,并自己处理原始ASP.NET请求-这将是.NET代码中最快的选项,例如:

SetConfig(new EndpointHostConfig { 
    RawHttpHandlers = { MiniProfilerHandler.MatchesRequest },
});
这就是内置MiniProfiler用于服务其静态内容的内容。只需使用
IHttpRequest
来确定它是否应该处理请求(通过返回IHttpHandler实例)或不应该(返回null):


除此之外,独立版本的ServiceStack(即HttpListener主机)应提供比ASP.NET更好的原始吞吐量。

如果设置(ASP配置),则IIS i/O线程上下文切换到CLR线程池上的线程会受到惩罚MaxConcurrentRequestsPerCPU将CLR代码设置为0您应该能够缓解这一问题(但可能会产生其他后果)


我不知道windows是否允许“零拷贝”:跳过文件(从不离开内核模式,跳过套接字上的缓冲区到文件句柄操作),但如果支持,IIS肯定会利用它(使它比用户模式下的CLR更快..)

感谢您对这个问题的回答,我可以解决在Mac上运行ServiceStack时遇到的问题。一段时间后,SS将停止为静态文件提供服务,尽管正在为动态Razor视图提供服务。只有重新启动流程才能解决问题。阅读您的答案后,我禁用了MiniProfiler(它已打开),问题停止。让你知道,如果你想再深入一点的话。
public static IHttpHandler MatchesRequest(IHttpRequest request)
{
    var file = Path.GetFileNameWithoutExtension(request.PathInfo);
    return file != null && file.StartsWith("ss-") 
        ? new MiniProfilerHandler()
        : null;
}