我正在尝试向REST Web服务发出多个相同的请求。我遇到的问题是,对于每个请求,似乎打开了一个新的套接字,这使得操作更多更慢(~x10)。 (与使用SOAP代理通道的相同操作进行比较时)。
我已经研究过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。
答案 0 :(得分:0)
在打开新响应之前关闭第一个响应。请考虑将GetXYZ()
放入using
语句中。 <{1}}默认为KeepAlive
。