我正在尝试向REST Web服务发出多个相同的请求。我遇到的问题是,对于每个请求,似乎都会打开一个新套接字,这使得操作更慢(〜x10)太多。 (与使用SOAP代理通道的相同操作相比)。多个相同的Web请求
我已经查看了HttpWebRequest.KeepAlive,但我无法多次调用同一个Web请求上的GetResponse()。
下面这段代码是什么,我需要的想法,是的,我知道这将无法工作,因为的原因,我在上面提到:
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(serviceUri);
req.KeepAlive = true;
var dcs = new DataContractSerializer(typeof(Test));
while (enabled)
{
var stream = req.GetResponse().GetResponseStream();
if (stream != null)
{
var test = (Test)dcs.ReadObject(stream);
counter++;
}
}
编辑:这是我使用的SOAP循环测试:
private void SoapLoop()
{
IService1 proxy =
ChannelFactory<IService1>.CreateChannel(
tcpBinding, endpointAddress);
while (enabled)
{
var test = proxy.GetRead(new GetReadRequest());
counter++;
}
}
我转移的对象在SOAP和REST中都是一样的,大约是300KB。
EDIT2:我做了一些进一步的测试:
上的小物件,例如:100个字节REST优于SOAP(〜2:1),但在大的对象(具有大的图像字节数组对象)SOAP快得多。
另一个奇怪的是,当我在REST循环中注释掉行var test = (Test)dcs.ReadObject(stream);
时,性能实际上下降了:S。
请不要将“C#”等添加到标题的末尾。这就是标签的用途。 – 2012-03-16 16:34:21
据我所知,你可以使用不同的'WebRequests',他们会尝试重用相同的连接。你确定实际上并没有发生,并且服务器确实支持'Keep-Alive'吗? – svick 2012-03-16 16:36:48
将你的'GetResponse'和'GetResponseStream'包装成'using(){...}'块,因为它们实现了'IDisposable'。 – 2012-03-16 16:40:54