/// <summary> /// Incluir um serviço (Wcf) /// </summary> /// <param name="servico">Serviço a ser incluído</param> public static void IncluirCanalWcfHost(ServiceType servico) { try { // Endereço string enderecoTmp = string.Format("net.tcp://{0}:{1}/PointBlankCore/{2}", WcfNetwork.ConexaoEndereco, WcfNetwork.ConexaoPorta, servico.GetServiceType(false).Name); // Instânciar um host para o serviço ServiceHost host = new ServiceHost(servico.GetServiceType(false), new Uri[] { new Uri(enderecoTmp) }); ServiceBehaviorAttribute serviceBehavior = host.Description.Behaviors.Find <ServiceBehaviorAttribute>(); serviceBehavior.IncludeExceptionDetailInFaults = true; // Controle endpoint host.AddServiceEndpoint(servico.GetServiceType(true), WcfNetwork.ObterNovoNetTcpBinding(), enderecoTmp); host.Description.Behaviors.Add(new ServiceThrottlingBehavior() { MaxConcurrentCalls = int.MaxValue, MaxConcurrentInstances = int.MaxValue, MaxConcurrentSessions = int.MaxValue }); // Abrir o serviço host.Open(); // Atualizar lista de controle WcfNetwork.ListaServiceHost.Add(host); } catch (AddressAlreadyInUseException) { throw new PointBlankException(string.Format("A porta {0} já está em uso. Verifique senão foi iniciado um outro serviço na mesma", WcfNetwork.ConexaoPorta)); } }
/// <summary> /// Criar canal de comunicação Wcf - Utilizando os dados padrões já informados /// </summary> /// <typeparam name="TChannel">Contrato wcf</typeparam> /// <param name="nomeServico">Nome do serviço</param> /// <param name="duplex">Identifica se é um canal duplex</param> /// <param name="callBack">Eventos de callback para canal duplex</param> /// <returns>Canal criado</returns> public static TChannel CriarNovoCanalWcf <TChannel>(string nomeServico, bool duplex, object callBack) { return(CriarNovoCanalWcf <TChannel>( WcfNetwork.ConexaoEndereco, WcfNetwork.ConexaoPorta, WcfNetwork.ObterNovoNetTcpBinding(), nomeServico, duplex, callBack)); }
/// <summary> /// Obter IGameServerBo /// </summary> /// <typeparam name="TReturn">Tipo do retorno</typeparam> /// <param name="code">Ação a ser executada</param> /// <returns>Retorno da ação</returns> public static TReturn GameServer <TReturn>(Func <IGameServerBo, TReturn> code) { IGameServerBo bo = FactoryBo.GameServerBo; try { return(code(bo)); } finally { WcfNetwork.FecharCanalWcf((IClientChannel)bo); } }
/// <summary> /// Obter IContaBo /// </summary> /// <param name="code">Ação a ser executada</param> public static void Conta(Action <IContaBo> code) { IContaBo bo = FactoryBo.ContaBo; try { code(bo); } finally { WcfNetwork.FecharCanalWcf((IClientChannel)bo); } }
/// <summary> /// Obter IContaBo /// </summary> /// <typeparam name="TReturn">Tipo do retorno</typeparam> /// <param name="code">Ação a ser executada</param> /// <returns>Retorno da ação</returns> public static TReturn Conta <TReturn>(Func <IContaBo, TReturn> code) { IContaBo bo = FactoryBo.ContaBo; try { return(code(bo)); } finally { WcfNetwork.FecharCanalWcf((IClientChannel)bo); } }
/// <summary> /// Obter IGameChannelBo /// </summary> /// <param name="code">Ação a ser executada</param> public static void GameChannel(Action <IGameChannelBo> code) { IGameChannelBo bo = FactoryBo.GameChannelBo; try { code(bo); } finally { WcfNetwork.FecharCanalWcf((IClientChannel)bo); } }
/// <summary> /// Criar canal de comunicação Wcf /// </summary> /// <typeparam name="TChannel">Contrato wcf</typeparam> /// <param name="enderecoUrl">Endereço url</param> /// <param name="enderecoPorta">Endereço Porta</param> /// <param name="chaveSeguranca">Chave de segurança (Descriptografada)</param> /// <param name="httpBinding">Objeto NetTcpBinding</param> /// <param name="nomeServico">Nome do serviço</param> /// <param name="duplex">Identifica se é um canal duplex</param> /// <param name="callBack">Eventos de callback para canal duplex</param> /// <returns>Canal criado</returns> public static TChannel CriarNovoCanalWcf <TChannel>( string enderecoUrl, int enderecoPorta, Binding httpBinding, string nomeServico, bool duplex, object callBack) { try { // Controle EndpointAddress endPoint = new EndpointAddress(new Uri(string.Format("net.tcp://{0}:{1}/PointBlankCore/{2}", enderecoUrl, enderecoPorta, nomeServico))); // ChannelFactory ChannelFactory <TChannel> scf = null; switch (duplex) { case true: scf = new DuplexChannelFactory <TChannel>(new InstanceContext(callBack), httpBinding, endPoint); break; default: scf = new ChannelFactory <TChannel>(httpBinding, endPoint); break; } // Criar o canal de comunicação TChannel canalRetorno = scf.CreateChannel(); // Validar conexão try { WcfNetwork.ValidarConexao(canalRetorno, enderecoUrl, enderecoPorta, false); } catch { try { scf.Abort(); } catch { Logger.Error("[WcfNetWork] - Erro ao Abortar o Canal WCF"); } throw; } // Retorno return(canalRetorno); } catch (PointBlankException) { throw; } catch (Exception exp) { // Erro gerado ao acionar o invoke do método de validação if ((exp is TargetInvocationException) && (exp.InnerException != null)) { // Erro de segurança if ((exp.InnerException is MessageSecurityException) && (exp.InnerException.InnerException != null)) { throw new PointBlankException(PointBlankException.GetMessageFull(exp.InnerException.InnerException, true)); } // Identificar se foi erro de time-out if (exp.InnerException is TimeoutException) { throw new PointBlankException("Não foi possível conectar no servidor de aplicação (Erro de Timeout)"); } throw new PointBlankException("Não foi possível conectar no servidor de aplicação.", exp.InnerException); } // Alterar tipo do exception para o padrão throw new PointBlankException("Não foi possível conectar no servidor de aplicação!", exp); } }
/// <summary> /// Validar a conexão /// </summary> /// <param name="communicationObject">Objeto ICommunicationObject</param> /// <param name="enderecoUrl">Endereço url</param> /// <param name="enderecoPorta">Endereço Porta</param> /// <param name="validarMetodoBo">Identifica se será chamado o método 'ValidarServicoWcf' do BO</param> public static void ValidarConexao(string enderecoUrl, int enderecoPorta) { WcfNetwork.ValidarConexao(null, enderecoUrl, enderecoPorta, false); }