我遇到一个问题,即我对Java端点(托管在Oracle GlassFish 3.1.X上)进行了很多非常小的Web服务调用。我将此服务添加为服务引用(使用远程wsdl文件)并使用BasicHttpBinding来访问它。
由于该服务位于世界的一半以及互联网上,因此我们在到达目的地时经常会遇到一些数据包丢失。我们正在寻找任何可能的方法来减少这些事件的影响。我们一直在使用Wireshark向我们详细了解到目的地的电汇,然后再回来。我很想知道,对于我们生成的每个请求,我们都会发送2个数据包。数据包边界始终位于HTTP标头和<s:Envelope>
标记之间。对我来说这是一个很大的开销,特别是在我想要最小化发送数据包的环境中(以减少整体数据包丢失)。
在大多数情况下(99%的呼叫),HTTP报头数据包为210字节,后跟291字节的SOAP信封数据包(不包括每个数据包的54字节TCP / IP开销)。总计这些给出了501个字节 - 仅超过我们的最大段大小1460字节的三分之一。为什么WCF不会将此HTTP POST请求作为501字节的单个数据包发送(如果包含54字节的TCP / IP开销,则为555字节)?
有谁知道为什么这样做?看起来好像HttpWebRequest对象在写入标题之后在流上调用.Flush(),但我不确定为什么会这样做?
我尝试过不同的组合:
ServicePointManager.UseNagleAlgorithm = false;
ServicePointManager.Expect100Continue = false;
没有效果。
修改
错误:我进一步调查了一下,当调用HttpWebRequest.GetRequestStream()时,它会立即将标头写入流中。在你写回给你的Stream之前的某个阶段,网络会刷新这些(我猜?除非在某处发生故意的冲洗)。当您最终开始写入流时,它已经发送了标头数据包。不知道如何防止这种情况,似乎在HttpWebRequest代码中调用GetRequestStream()的一个非常难的断言将写入头文件。对于我的小请求,我希望在关闭流之前不要写任何内容,但这违背了它的流媒体特性。
答案 0 :(得分:0)
答案是 - 无法使用WebHttpRequest
(因此BasicHttpBinding
)
http://us.generation-nt.com/answer/too-packets-httpwebrequest-help-23298102.html