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)
        {
            var contract = new RedirectRepeatResponse();

            byte masterNodeId = 1;

            IPAddress publiIpAddress;
            if (PublicIPAddressReader.TryParsePublicIpAddress(MasterServerSettings.Default.PublicIPAddress, out publiIpAddress) == false)
            {
                // TODO: how to handle ?
                log.WarnFormat("Failed to parse public ipAdress");
                contract.Address = "";
            }
            else
            {
                switch (this.NetworkProtocol)
                {
                    case NetworkProtocolType.Tcp:
                        contract.Address = new IPEndPoint(publiIpAddress, MasterServerSettings.Default.MasterRelayPortTcp + masterNodeId - 1).ToString();
                        break;
                    case NetworkProtocolType.WebSocket:
                        contract.Address =
                            new IPEndPoint(publiIpAddress, MasterServerSettings.Default.MasterRelayPortWebSocket + masterNodeId - 1).ToString();
                        break;
                    case NetworkProtocolType.Udp:
                        // no redirect through relay ports for UDP... how to handle?
                        contract.Address =
                            new IPEndPoint(publiIpAddress, MasterServerSettings.Default.MasterRelayPortUdp + masterNodeId - 1).ToString();
                        break;
                }
            }

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

            this.SendOperationResponse(response, sendParameters);
        }