public async Task <IHttpActionResult> ConnectAndInvoke([FromBody] HubNamesAndHubMethodInvocations hubNamesAndHubMethodInvocations)
        {
            Session session;

            try
            {
                session = await PerformConnect(hubNamesAndHubMethodInvocations.HubNames);
            }
            catch (ArgumentOutOfRangeException)
            {
                return(NotFound());
            }
            return(Ok(new
            {
                ConnectionId = session.ConnectionId,
                ReturnValues = await ExecuteMultipleHubMethodInvocations(hubNamesAndHubMethodInvocations.HubMethodInvocations, session, Request)
            }));
        }
        public async Task <IHttpActionResult> ReconnectAndInvoke(string connectionId, [FromBody] HubNamesAndHubMethodInvocations hubNamesAndHubMethodInvocations)
        {
            Session session;
            bool    sessionRetrieved;

            sessionManagementLock.EnterReadLock();
            try
            {
                sessionRetrieved = sessions.TryGetValue(connectionId, out session);
            }
            finally
            {
                sessionManagementLock.ExitReadLock();
            }
            if (!sessionRetrieved)
            {
                try
                {
                    session = await PerformConnect(hubNamesAndHubMethodInvocations.HubNames, connectionId);
                }
                catch (ArgumentOutOfRangeException)
                {
                    return(NotFound());
                }
                return(Ok(new
                {
                    ConnectionId = session.ConnectionId,
                    ReturnValues = await ExecuteMultipleHubMethodInvocations(hubNamesAndHubMethodInvocations.HubMethodInvocations, session, Request)
                }));
            }
            if (!session.Hubs.Keys.OrderBy(n => n).SequenceEqual(hubNamesAndHubMethodInvocations.HubNames.OrderBy(n => n), StringComparer.OrdinalIgnoreCase))
            {
                return(Conflict());
            }
            return(Ok(new
            {
                Events = GetEvents(session),
                ReturnValues = await ExecuteMultipleHubMethodInvocations(hubNamesAndHubMethodInvocations.HubMethodInvocations, session, Request)
            }));
        }