我目前正在阅读很多关于node.js.的内容.使用传统线程每个请求模型(Apache)的服务器与使用事件循环(Nginx,节点,Tornado)的服务器之间经常进行比较.
我想详细了解如何在ASP.NET中处理请求 - 从http.sys中一直收到它直到在ASP.NET本身处理它.我发现http.sys和IIS上的MSDN文档有点缺乏,但也许我的google-fu今天很弱.到目前为止,我找到的最好的资源是Thomas Marquardt博客上的帖子.
任何人都可以对这个话题有更多的了解,或者指出任何其他资源?
(出于这个问题的目的,我只对具有典型集成管道的IIS7感兴趣)
我正在使用同步apis和线程池的tcp服务器上看起来像这样:
TcpListener listener;
void Serve(){
while(true){
var client = listener.AcceptTcpClient();
ThreadPool.QueueUserWorkItem(this.HandleConnection, client);
//Or alternatively new Thread(HandleConnection).Start(client)
}
}
Run Code Online (Sandbox Code Playgroud)
假设我的目标是在资源使用率最低的情况下处理尽可能多的并发连接,这似乎很快就会受到可用线程数量的限制.我怀疑通过使用非阻塞任务apis,我将能够用更少的资源处理更多.
我最初的印象是这样的:
async Task Serve(){
while(true){
var client = await listener.AcceptTcpClientAsync();
HandleConnectionAsync(client); //fire and forget?
}
}
Run Code Online (Sandbox Code Playgroud)
但令我印象深刻的是,这可能会导致瓶颈.也许HandleConnectionAsync需要花费非常长的时间才能达到第一次等待,并且将阻止主接受循环继续进行.这只会使用一个线程,还是运行时会在多个线程上神奇地运行它看起来合适的东西?
有没有办法结合这两种方法,以便我的服务器将使用它所需的线程数量来确定正在运行的任务的数量,但是它不会在IO操作上不必要地阻塞线程?
在这样的情况下,是否存在最大化吞吐量的惯用方法?
我有一个.NET Windows服务,它产生一个基本上只是作为一个线程的线程HttpListener
.这在同步模式示例中工作正常......
private void CreateLListener()
{
HttpListenerContext context = null;
HttpListener listener = new HttpListener();
bool listen = true;
while(listen)
{
try
{
context = listener.GetContext();
}
catch (...)
{
listen = false;
}
// process request and make response
}
}
Run Code Online (Sandbox Code Playgroud)
我现在遇到的问题是我需要这个来处理多个请求并让它们同时响应或者至少以重叠的方式响应.
进一步解释 - 客户端是一个媒体播放器应用程序,它首先请求带有请求标头属性的媒体文件Range bytes=0-
.据我所知,它可以解决媒体容器的问题.
在读取了"块"之后(或者如果它已经读取足以确定媒体类型),它就会发出另一个请求(来自不同的客户端套接字号)Range bytes=X-Y
.在这种情况下,Y是第一个响应中返回的Content-Length,X比该值小250000个字节(使用IIS作为测试发现).在这个阶段,它正在获得最后一个"块",看它是否可以获得媒体时间戳来衡量长度.
读完之后,它会Range bytes=0-
(从另一个套接字号)发出另一个请求,开始正确地流式传输媒体文件.
但是,在任何时候,如果客户端的用户执行"跳过"操作,则它发送另一个请求(来自另一个套接字号),Range bytes=Z-
其中Z是要跳转到媒体文件中的位置.
我对HTTP的东西不是很好,但据我所知,我需要使用多个线程来处理每个请求/响应,同时允许原始文件HttpListener
返回监听.我做了很多搜索,但找不到一个似乎合适的模型.
编辑:
感谢Rick Strahl对以下示例的感谢,我能够根据自己的需要进行调整......
c# ×2
asp.net ×1
async-await ×1
http.sys ×1
httplistener ×1
iis ×1
tcplistener ×1
threadpool ×1