protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters)
        {
            var contract = new RedirectRepeatResponse();

            const byte masterNodeId = 1;

            // TODO: don't lookup for every operation!
            IPAddress publicIpAddress = PublicIPAddressReader.ParsePublicIpAddress(MasterServerSettings.Default.PublicIPAddress);

            switch (this.NetworkProtocol)
            {
            case NetworkProtocolType.Tcp:
                contract.Address =
                    new IPEndPoint(
                        publicIpAddress, MasterServerSettings.Default.MasterRelayPortTcp + masterNodeId - 1).ToString
                        ();
                break;

            case NetworkProtocolType.WebSocket:
                contract.Address =
                    new IPEndPoint(
                        publicIpAddress, MasterServerSettings.Default.MasterRelayPortWebSocket + masterNodeId - 1).
                    ToString();
                break;

            case NetworkProtocolType.Udp:
                // no redirect through relay ports for UDP... how to handle?
                contract.Address =
                    new IPEndPoint(
                        publicIpAddress, MasterServerSettings.Default.MasterRelayPortUdp + masterNodeId - 1).ToString
                        ();
                break;
            }


            var response = new OperationResponse(operationRequest.OperationCode, contract)
            {
                ReturnCode   = (short)ErrorCode.RedirectRepeat,
                DebugMessage = "redirect"
            };

            this.SendOperationResponse(response, sendParameters);
        }
        protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters)
        {
            Dictionary <byte, object> dict = operationRequest.Parameters;

            foreach (object value in dict.Values)
            {
                MasterApplication.log.Info("============RedirectedClientPeer==========:" + value.ToString());
            }

            var contract = new RedirectRepeatResponse();

            const byte masterNodeId = 1;

            // TODO: don't lookup for every operation!
            IPAddress publicIpAddress = PublicIPAddressReader.ParsePublicIpAddress(MasterServerSettings.Default.PublicIPAddress);

            switch (this.NetworkProtocol)
            {
            case NetworkProtocolType.Tcp:
                contract.Address =
                    new IPEndPoint(
                        publicIpAddress, MasterServerSettings.Default.MasterRelayPortTcp + masterNodeId - 1).ToString
                        ();
                break;

            case NetworkProtocolType.WebSocket:
                contract.Address =
                    new IPEndPoint(
                        publicIpAddress, MasterServerSettings.Default.MasterRelayPortWebSocket + masterNodeId - 1).
                    ToString();
                break;

            case NetworkProtocolType.Udp:
                // no redirect through relay ports for UDP... how to handle?
                contract.Address =
                    new IPEndPoint(
                        publicIpAddress, MasterServerSettings.Default.MasterRelayPortUdp + masterNodeId - 1).ToString
                        ();
                break;
            }


            var response = new OperationResponse(operationRequest.OperationCode, contract)
            {
                ReturnCode   = (short)ErrorCode.RedirectRepeat,
                DebugMessage = "redirect"
            };

            BaseHandler handler = DictTools.GetValue <ServerToServer.Operations.OperationCode, BaseHandler>(MasterApplication.Instance.Handlerict, (ServerToServer.Operations.OperationCode)operationRequest.OperationCode);

            if (handler != null)
            {
                handler.OnOperationRequest(operationRequest, sendParameters, this);
            }
            else
            {
                BaseHandler defaultHandler = DictTools.GetValue <ServerToServer.Operations.OperationCode, BaseHandler>(MasterApplication.Instance.Handlerict, ServerToServer.Operations.OperationCode.Default);
                defaultHandler.OnOperationRequest(operationRequest, sendParameters, this);
            }

            this.SendOperationResponse(response, sendParameters);
        }