C# 使用集线器的广播消息信号器规模测试

C# 使用集线器的广播消息信号器规模测试,c#,.net,testing,signalr,scale,C#,.net,Testing,Signalr,Scale,我有一个非常简单的基于signarhub的应用程序,它基本上每次向大约1000个客户机定期发送一种消息 我希望能够在一个可重复的负载测试环境中测试1000个web浏览器是否可以连接并接收来自集线器的消息 我已经看到信号器文档显示了如何使用曲柄工具进行负载测试。但这样做的局限性是无法测试集线器类型的部署,这是没有帮助的 有没有人见过如何创建一个中心和客户端的实例,并测试X个客户端在某个时间范围内都收到了一条消息?根据zaitsman的评论,我想出了下面的代码,希望能得到一些反馈 [TestClas

我有一个非常简单的基于signarhub的应用程序,它基本上每次向大约1000个客户机定期发送一种消息

我希望能够在一个可重复的负载测试环境中测试1000个web浏览器是否可以连接并接收来自集线器的消息

我已经看到信号器文档显示了如何使用曲柄工具进行负载测试。但这样做的局限性是无法测试集线器类型的部署,这是没有帮助的


有没有人见过如何创建一个中心和客户端的实例,并测试X个客户端在某个时间范围内都收到了一条消息?

根据zaitsman的评论,我想出了下面的代码,希望能得到一些反馈

[TestClass]
public class SignalRConnectionTest
{
    static AutoResetEvent _autoEvent = new AutoResetEvent(false);
    private const string HUB_URL = "http://mysite/signalr";
    private const string HUB_NAME = "chatHub";

    private static Dictionary<int, bool> _clientResponsesRecieved = new Dictionary<int, bool>();

    private static object lockObject = new object();

    [TestMethod]
    public void TestJoinHub()
    {
        const int numberOfClients = 10;

        var manualEvents = new ManualResetEvent[numberOfClients];

        for (int i = 0; i < numberOfClients; i++)
        {
            manualEvents[i] = new ManualResetEvent(false);

            var stateInfo = new State(manualEvents[i], i);
            ThreadPool.QueueUserWorkItem(ConnectToSignalRAndWaitForMessage, stateInfo);
        }

        foreach (var manualResetEvent in manualEvents)
            manualResetEvent.WaitOne();

        Assert.AreEqual(_clientResponsesRecieved.Count, numberOfClients);

        foreach (var key in _clientResponsesRecieved.Keys)
        {
            Assert.IsTrue(_clientResponsesRecieved[key]);
        }
    }

    class State
    {
        public int threadId = 0;
        public ManualResetEvent manualEvent;

        public State(ManualResetEvent manualEvent, int threadId)
        {
            this.manualEvent = manualEvent;
            this.threadId = threadId;
        }
    }

    private void ConnectToSignalRAndWaitForMessage(object state)
    {
        var stateInfo = (State) state;

        var hubConnection = new HubConnection(HUB_URL);
        var chatHub = hubConnection.CreateHubProxy(HUB_NAME);

        Console.WriteLine("Starting connection");

        hubConnection.Start().Wait();

        chatHub.On<string, string>("broadcastMessage", (username, message) =>
        {
            Console.WriteLine("Message Recieved: {0}", message);

            lock (lockObject)
            {
                _clientResponsesRecieved.Add(stateInfo.threadId, true);
            }

            stateInfo.manualEvent.Set();

        });
    }
}

您是在负载测试服务器还是客户端实现?服务器组件在这个阶段,但我还想确认每个客户端都收到了消息。在这种情况下,IMO最容易做的事情是创建一个控制台客户端,其中多线程任务连接到您的中心,并在一些虚拟化环境中运行。