我正在创建一个代理,它侦听特定端口上的传入连接。连接通常是Http请求(GET/POST)。无法决定是选择HttpListener还是套接字。我将在代理中修改HttpRequests,然后将其中继到最终目的地。
你什么时候喜欢HttpListener而不是套接字。每种方法的好处是什么?
发布于 2013-09-28 23:34:05
2016年11月更新:当接收远程计算机的流量时,HttpListener工作得很好。然而,当客户端在本地主机上时,HttpListener对于大的有效负载来说是一个糟糕的选择,从性能上讲。造成这种情况的部分原因是因为HttpListener使用了http.sys (这是一个内核模块),而且很明显,实现会导致身体数据的几个额外副本被生成。例如,在C#中将100 MB从一个数组复制到另一个数组需要35 ms,而POSTing 100 MB从本地客户端复制到HttpListener需要350 ms (是的,长10倍)。在这种情况下,切换到Mono的HttpListener将时间缩短到250 ms。与套接字客户端一起使用TcpListener需要180 ms。使用CircularBuffer交换套接字使用MemoryMappedFiles需要55 ms。因此,当从本地机器访问时,HttpListener对于大的有效负载就不能很好地工作。注意:如果你试图复制这个测试,你需要注意测量时差。Stern开始发送数据,并且当数组在接收过程中完成填充时,一些发送/写入方法几乎立即返回,而不发送任何数据(您可以通过发送一个零数组,然后从数组的后面写入数据,使其成为前沿;您将接收几乎所有的数据,证明数据是在函数返回后很久才发送的)。
关于HttpListener对Mono的HttpListener的本地机器性能缺陷的更多详细信息,来自我的同事之一:https://www.linkedin.com/pulse/http-inefficiency-dominika-blach
https://stackoverflow.com/questions/12640746
复制相似问题