gpt4 book ai didi

.NET Web服务调用池?

转载 作者:行者123 更新时间:2023-12-02 14:10:43 25 4
gpt4 key购买 nike

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

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

System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted

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

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

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

在生产中,调用永远不会以这种速度进行,因此不会出现问题......但最好有一些代码允许测试工作,并限制或共享连接。

谢谢

最佳答案

事实证明,一位同事已经有一个解决方案已在我们的电子商务网站上使用。您只需继承您的网络服务,使用一些不同的设置覆盖 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);
}

}

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

关于.NET Web服务调用池?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2067441/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com