2012-03-16 76 views
0

我正在尝试向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。

+3

请不要将“C#”等添加到标题的末尾。这就是标签的用途。 – 2012-03-16 16:34:21

+0

据我所知,你可以使用不同的'WebRequests',他们会尝试重用相同的连接。你确定实际上并没有发生,并且服务器确实支持'Keep-Alive'吗? – svick 2012-03-16 16:36:48

+0

将你的'GetResponse'和'GetResponseStream'包装成'using(){...}'块,因为它们实现了'IDisposable'。 – 2012-03-16 16:40:54

回答

0

在打开新的响应之前关闭第一个响应。请考虑将GetXYZ()置于using声明中。 KeepAlive默认为true

+0

正如我上面所说:这是Skeleton,它不是工作代码。我添加了stream.Close()和Response.Close()。性能较好,但仍比使用基于SOAP的服务的类似循环慢得多。 – user472875 2012-03-16 16:47:28

+0

所以,如果我明白,现在上面的代码工作,但性能不是你所期望的?你能在这两种情况下发布你用来测试表演的完整代码吗? – 2012-03-16 16:58:24