4

我正在编写验收测试来验证系统,它的数据访问都是通过 Web 服务调用完成的。

不幸的是,因为我打了很多电话,所以很快,我遇到了以下错误

System.Net.Sockets.SocketException:每个套接字地址(协议/网络地址/端口)通常只允许使用一次

我已经在本地缓存了尽可能多的调用,但这还不够。我不能伪造或嘲笑这些电话。它们必须是真实的,才能使这一级别的测试有效。

有没有办法让重复频繁的 Web 服务调用池?

或者在尝试调用之前检查是否可以与服务建立连接,然后等到可用的套接字存在?

在生产中,调用永远不会以这种速度进行,因此不会出现问题……但是如果有一些代码可以让测试工作,并限制或共享连接,那就太好了。

谢谢

4

3 回答 3

2

事实证明,一位同事已经在我们的电子商务网站上使用了一个解决方案。你只需从你的网络服务继承,用一些不同的设置覆盖 GetWebRequest 函数,你就完成了。

class SafeMyWebService : MyWS.Service
{
    private static int _lastBindPortUsed;

    protected override WebRequest GetWebRequest(Uri uri)
    {
        var webreq = base.GetWebRequest(uri) as HttpWebRequest;

        webreq.KeepAlive = true;
        webreq.ProtocolVersion = HttpVersion.Version10;
        webreq.ServicePoint.MaxIdleTime = 10 * 1000; // milliseconds 
        webreq.ServicePoint.BindIPEndPointDelegate = new BindIPEndPoint(BindIPEndPointCallback);
        webreq.Timeout = 2000;
        webreq.ConnectionGroupName = "MyConnectionGroupName";

        return webreq;
    }

    public static IPEndPoint BindIPEndPointCallback(ServicePoint servicePoint, IPEndPoint remoteEndPoint, int retryCount)
    {
        int port = Interlocked.Increment(ref _lastBindPortUsed);
        Interlocked.CompareExchange(ref _lastBindPortUsed, 5001, 65534);

        return remoteEndPoint.AddressFamily == AddressFamily.InterNetwork 
            ? new IPEndPoint(IPAddress.Any, port) 
            : new IPEndPoint(IPAddress.IPv6Any, port);
    }

}

我猜它使用更多资源,但它不会失败。

于 2010-01-15T14:42:22.867 回答
1

MSDN 文章避免 TCP/IP 端口交换推荐以下方法

  • 增加通过注册中心可用的临时端口数量(即客户端分配的用于调用 Web 服务的端口)
  • 减少 TCP/IP 超时以更快地释放端口(再次通过注册表)。

您还应该在测试拆解中的每次调用后检查您是否正确关闭了连接。

或者,如果您不想进行任何配置更改,您可以扫描临时端口范围,如果没有可用端口,请暂停并等待一些被释放。文章“检测下一个可用的空闲 TCP 端口”有一些示例代码可用于此目的。

于 2010-01-14T20:55:51.063 回答
0

一个简单的解决方案是通过让您的线程休眠一小段时间来减慢您的测试速度;比生产中的要快,但比用完所有端口的要短。

应用程序或系统没有变化。

于 2010-01-14T21:22:28.950 回答