我正在异步操作(一系列网络IO)上实现超时,我不确定哪个'更好'(从分配/性能)角度来看:创建EventWaitHandle并使用RegisterWaitForSingleObject,或者只是创建一个Timer并使用其Tick.
在我的特定情况下,EventWaitHandle是惰性创建的,但显然它必须被实例化以使用WaitForSingleObject.所以这真是一个关于WaitHandle + WaitForSingleObject与Timer的资源成本的问题.这两种方法都很容易实现.
我已经在不同的时间实现了这两个,所以我了解地形,我只是不确定哪种方法"更好".
我在针对嵌入式设备上的HTTP守护进程使用HttpWebRequest时遇到问题.问题似乎是在写入套接字流的http标头与http有效负载(POST)之间存在足够的延迟,即套接字将套接字缓冲区中的内容释放到服务器.这导致HTTP请求被分割为两个数据包(碎片).
当然,这是完全有效的,但是如果分组被分割超过大约1.8ms,则另一端的服务器不能处理它.所以我想知道是否有任何现实的方法来控制它(在客户端上).
在HttpWebRequest上似乎没有任何属性可以对用于发送的套接字进行这种级别的控制,并且似乎无法访问套接字本身(即通过反射),因为它仅在发送期间创建,并且之后发布(作为出站http连接池的一部分).BufferWriteStream属性只缓冲webrequest中的正文内容(因此它仍然可用于重定向等...),并且似乎不会影响整个请求写入套接字的方式.
那么该怎么办?
(我真的试图避免从套接字重新编写HTTP客户端)
一种选择可能是编写HttpWebRequest发送给的某种代理(可能通过ServicePoint),并在该实现缓冲区中写入整个TCP请求.但这似乎是一项艰苦的工作.
当我运行Fidder时也会正常工作(出于同样的原因)但在我们的生产环境中这不是一个真正的选择......
[ps:我知道这肯定是碎片数据包之间的间隔问题,因为我敲了一个套接字级别的测试,我使用NoDelay套接字显式控制了碎片]
(再次)对 .Net 中的 http url 保留以及何时需要/不需要它们感到困惑。
我创建了一个“hello world”.net 4.5 控制台应用程序,将其配置为在http://localhost:9001上托管基本服务,并以非管理员身份运行。
当服务由 Nancy 自托管时,它会失败并表示需要 URL 预留(netsh http add http://localhost:9001等...)
但是,如果服务由 Nancy-hosted-in-OWIN 托管,使用 OWIN 自托管,则localhost uris显然不需要此类 URL 预留。
是什么赋予了?该错误是否来自 Nancy 虚假(可能是旨在引导成功的配置检查中的误报),还是 Nancy 自托管使用了与 OWIN 自托管不同的 API 集(以某种方式)更加挑剔?
(注意:我知道http://+:port和http://some.ip:port预订需要预订,我正在尝试找出为什么http://localhost:port行为似乎有所不同)