Exemplo n.º 1
0
        /// <summary>
        /// Metodo responsável por invocar o serviço do WebService do SEFAZ
        /// </summary>
        /// <param name="wsProxy">Objeto da classe construida do WSDL</param>
        /// <param name="servicoWS">Objeto da classe de envio do XML</param>
        /// <param name="metodo">Método da classe de envio do XML que faz o envio</param>
        /// <param name="cabecMsg">Objeto da classe de cabecalho do serviço</param>
        /// <param name="servicoNFe">Objeto do Serviço de envio da NFE do UniNFe</param>
        /// <param name="finalArqEnvio">string do final do arquivo a ser enviado. Sem a extensão ".xml"</param>
        /// <param name="finalArqRetorno">string do final do arquivo a ser gravado com o conteúdo do retorno. Sem a extensão ".xml"</param>
        /// <remarks>
        /// Autor: Wandrey Mundin Ferreira
        /// Data: 17/03/2010
        /// </remarks>
        public void InvocarNFSe(WebServiceProxy wsProxy,
                                object servicoWS,
                                string metodo,
                                string cabecMsg,
                                object servicoNFe,
                                string finalArqEnvio,
                                string finalArqRetorno,
                                PadroesNFSe padraoNFSe,
                                Servicos servicoNFSe,
                                SecurityProtocolType securityProtocolType)
        {
            int emp = Empresas.FindEmpresaByThread();

            finalArqEnvio   = Functions.ExtractExtension(finalArqEnvio);
            finalArqRetorno = Functions.ExtractExtension(finalArqRetorno);

            XmlDocument docXML = new XmlDocument();

            // Definir o tipo de serviço da NFe
            Type typeServicoNFe = servicoNFe.GetType();

            // Resgatar o nome do arquivo XML a ser enviado para o webservice
            string XmlNfeDadosMsg = (string)(typeServicoNFe.InvokeMember("NomeArquivoXML", System.Reflection.BindingFlags.GetProperty, null, servicoNFe, null));

            // Exclui o Arquivo de Erro
            Functions.DeletarArquivo(Empresas.Configuracoes[emp].PastaXmlRetorno + "\\" + Functions.ExtrairNomeArq(XmlNfeDadosMsg, finalArqEnvio + ".xml") + finalArqRetorno + ".err");

            // Validar o Arquivo XML
            ValidarXML validar             = new ValidarXML(XmlNfeDadosMsg, Empresas.Configuracoes[emp].UnidadeFederativaCodigo, false);
            string     cResultadoValidacao = validar.ValidarArqXML(XmlNfeDadosMsg);

            if (cResultadoValidacao != "")
            {
                switch (padraoNFSe)
                {
                case PadroesNFSe.SMARAPD:
                    break;

                default:
                    throw new Exception(cResultadoValidacao);
                }
            }

            //Definir novamente o protocolo de segurança, pois é uma propriedade estática e o seu valor pode ser alterado antes do envio. Wandrey 03/05/2016
            ServicePointManager.SecurityProtocol = securityProtocolType;

            // Montar o XML de Lote de envio de Notas fiscais
            docXML.Load(XmlNfeDadosMsg);

            // Definir Proxy
            if (ConfiguracaoApp.Proxy && wsProxy != null)
            {
                switch (padraoNFSe)
                {
                case PadroesNFSe.BETHA:
                    wsProxy.Betha.Proxy = Proxy.DefinirProxy(ConfiguracaoApp.ProxyServidor, ConfiguracaoApp.ProxyUsuario, ConfiguracaoApp.ProxySenha, ConfiguracaoApp.ProxyPorta, ConfiguracaoApp.DetectarConfiguracaoProxyAuto);
                    break;

                default:
                    wsProxy.SetProp(servicoWS, "Proxy", Proxy.DefinirProxy(ConfiguracaoApp.ProxyServidor, ConfiguracaoApp.ProxyUsuario, ConfiguracaoApp.ProxySenha, ConfiguracaoApp.ProxyPorta, ConfiguracaoApp.DetectarConfiguracaoProxyAuto));
                    break;
                }
            }

            // Limpa a variável de retorno
            string strRetorno = string.Empty;

            //Vou mudar o timeout para evitar que demore a resposta e o uninfe aborte antes de recebe-la. Wandrey 17/09/2009
            //Isso talvez evite de não conseguir o número do recibo se o serviço do SEFAZ estiver lento.
            if (wsProxy != null)
            {
                switch (padraoNFSe)
                {
                case PadroesNFSe.NOTAINTELIGENTE:
                case PadroesNFSe.BETHA:
                    break;

                default:
                    wsProxy.SetProp(servicoWS, "Timeout", 120000);
                    break;
                }
            }

            //Invocar o membro
            switch (padraoNFSe)
            {
                #region Padrão BETHA

            case PadroesNFSe.BETHA:
                switch (metodo)
                {
                case "ConsultarSituacaoLoteRps":
                    strRetorno = wsProxy.Betha.ConsultarSituacaoLoteRps(docXML, Empresas.Configuracoes[emp].AmbienteCodigo);
                    break;

                case "ConsultarLoteRps":
                    strRetorno = wsProxy.Betha.ConsultarLoteRps(docXML, Empresas.Configuracoes[emp].AmbienteCodigo);
                    break;

                case "CancelarNfse":
                    strRetorno = wsProxy.Betha.CancelarNfse(docXML, Empresas.Configuracoes[emp].AmbienteCodigo);
                    break;

                case "ConsultarNfse":
                    strRetorno = wsProxy.Betha.ConsultarNfse(docXML, Empresas.Configuracoes[emp].AmbienteCodigo);
                    break;

                case "ConsultarNfsePorRps":
                    strRetorno = wsProxy.Betha.ConsultarNfsePorRps(docXML, Empresas.Configuracoes[emp].AmbienteCodigo);
                    break;

                case "RecepcionarLoteRps":
                    strRetorno = wsProxy.Betha.RecepcionarLoteRps(docXML, Empresas.Configuracoes[emp].AmbienteCodigo);
                    break;
                }
                break;

                #endregion Padrão BETHA

                #region NOTAINTELIGENTE

            case PadroesNFSe.NOTAINTELIGENTE:
                //NFe.Components.PClaudioMG.api_portClient wsClaudio = (NFe.Components.PClaudioMG.api_portClient)servicoWS;

                switch (servicoNFSe)
                {
                case Servicos.NFSeRecepcionarLoteRps:
                    //strRetorno = wsClaudio.RecepcionarLoteRps(docXML.OuterXml.ToString());
                    break;
                }
                //strRetorno = wsProxy.InvokeStr(servicoWS, metodo, new object[] { docXML.OuterXml.ToString() });
                break;

                #endregion NOTAINTELIGENTE

                #region Padrão ISSONLINE

            case PadroesNFSe.ISSONLINE_ASSESSORPUBLICO:
                int    operacao;
                string senhaWs = Functions.GetMD5Hash(Empresas.Configuracoes[emp].SenhaWS);

                switch (servicoNFSe)
                {
                case Servicos.NFSeRecepcionarLoteRps:
                    operacao = 1;
                    break;

                case Servicos.NFSeCancelar:
                    operacao = 2;
                    break;

                default:
                    operacao = 3;
                    break;
                }

                strRetorno = wsProxy.InvokeStr(servicoWS, metodo, new object[] { Convert.ToSByte(operacao), Empresas.Configuracoes[emp].UsuarioWS, senhaWs, docXML.OuterXml });
                break;

                #endregion Padrão ISSONLINE

                #region Padrão Blumenau-SC

            case PadroesNFSe.BLUMENAU_SC:
                strRetorno = wsProxy.InvokeStr(servicoWS, metodo, new object[] { 1, docXML.OuterXml });
                break;

                #endregion Padrão Blumenau-SC

                #region Padrão Paulistana

            case PadroesNFSe.PAULISTANA:
                strRetorno = wsProxy.InvokeStr(servicoWS, metodo, new object[] { 1, docXML.OuterXml });
                break;

                #endregion Padrão Paulistana

                #region TECNOSISTEMAS

            case PadroesNFSe.TECNOSISTEMAS:
                strRetorno = wsProxy.InvokeStr(servicoWS, metodo, new object[] { docXML.OuterXml, cabecMsg.ToString() });
                break;

                #endregion TECNOSISTEMAS

                #region SMARAPD

            case PadroesNFSe.SMARAPD:
                if (metodo == "nfdEntradaCancelar")
                {
                    strRetorno = wsProxy.InvokeStr(servicoWS, metodo, new object[] { Empresas.Configuracoes[emp].UsuarioWS,
                                                                                     TFunctions.EncryptSHA1(Empresas.Configuracoes[emp].SenhaWS),
                                                                                     docXML.OuterXml });
                }
                else if (metodo == "nfdSaida")
                {
                    strRetorno = wsProxy.InvokeStr(servicoWS, metodo, new object[] { Empresas.Configuracoes[emp].UsuarioWS,
                                                                                     TFunctions.EncryptSHA1(Empresas.Configuracoes[emp].SenhaWS),
                                                                                     Empresas.Configuracoes[emp].UnidadeFederativaCodigo.ToString(),
                                                                                     docXML.OuterXml });
                }
                else if (metodo == "urlNfd")
                {
                    strRetorno = wsProxy.InvokeStr(servicoWS, metodo, new object[] { Convert.ToInt32(docXML.GetElementsByTagName("codigoMunicipio")[0].InnerText),
                                                                                     Convert.ToInt32(docXML.GetElementsByTagName("numeroNfd")[0].InnerText),
                                                                                     Convert.ToInt32(docXML.GetElementsByTagName("serieNfd")[0].InnerText),
                                                                                     docXML.GetElementsByTagName("inscricaoMunicipal")[0].InnerText });
                }
                else
                {
                    strRetorno = wsProxy.InvokeStr(servicoWS, metodo, new object[] { Empresas.Configuracoes[emp].UsuarioWS,
                                                                                     TFunctions.EncryptSHA1(Empresas.Configuracoes[emp].SenhaWS),
                                                                                     Empresas.Configuracoes[emp].UnidadeFederativaCodigo,
                                                                                     docXML.OuterXml });
                }
                break;

                #endregion SMARAPD

                #region ISSWEB

            case PadroesNFSe.ISSWEB:
                string versao = docXML.DocumentElement.GetElementsByTagName("Versao")[0].InnerText;
                string cnpj   = docXML.DocumentElement.GetElementsByTagName("CNPJCPFPrestador")[0].InnerText;
                strRetorno = wsProxy.InvokeStr(servicoWS, metodo, new object[] { cnpj, docXML.OuterXml, versao });
                break;

                #endregion ISSWEB

                #region NA_INFORMATICA

            case PadroesNFSe.NA_INFORMATICA:
                switch (servicoNFSe)
                {
                    #region Recepcionar Lote RPS - Assíncrono

                case Servicos.NFSeRecepcionarLoteRps:
                    //if (Empresas.Configuracoes[emp].AmbienteCodigo == (int)TipoAmbiente.taProducao)
                    //{
                    //    ((Components.PCorumbaMS.NfseWSService)servicoWS).ClientCertificates.Add(Empresas.Configuracoes[emp].X509Certificado);
                    //    Components.PCorumbaMS.RecepcionarLoteRps dadosEnvio = new Components.PCorumbaMS.RecepcionarLoteRps();
                    //    Components.PCorumbaMS.RecepcionarLoteRpsResponse dadosRetorno = new Components.PCorumbaMS.RecepcionarLoteRpsResponse();
                    //    dadosEnvio.EnviarLoteRpsEnvio = docXML.OuterXml.ToString();
                    //    dadosRetorno = ((Components.PCorumbaMS.NfseWSService)servicoWS).RecepcionarLoteRps(dadosEnvio);
                    //    strRetorno = dadosRetorno.EnviarLoteRpsResposta;
                    //}
                    //else
                    //{
                    //    ((Components.HCorumbaMS.NfseWSService)servicoWS).ClientCertificates.Add(Empresas.Configuracoes[emp].X509Certificado);
                    //    Components.HCorumbaMS.RecepcionarLoteRps dadosEnvio = new Components.HCorumbaMS.RecepcionarLoteRps();
                    //    Components.HCorumbaMS.RecepcionarLoteRpsResponse dadosRetorno = new Components.HCorumbaMS.RecepcionarLoteRpsResponse();
                    //    dadosEnvio.EnviarLoteRpsEnvio = docXML.OuterXml.ToString();
                    //    dadosRetorno = ((Components.HCorumbaMS.NfseWSService)servicoWS).RecepcionarLoteRps(dadosEnvio);
                    //    strRetorno = dadosRetorno.EnviarLoteRpsResposta;
                    //}
                    break;

                    #endregion Recepcionar Lote RPS - Assíncrono

                    #region Recepcionar Lote RPS - Síncrono

                case Servicos.NFSeRecepcionarLoteRpsSincrono:
                    //if (Empresas.Configuracoes[emp].AmbienteCodigo == (int)TipoAmbiente.taProducao)
                    //{
                    //    ((Components.PCorumbaMS.NfseWSService)servicoWS).ClientCertificates.Add(Empresas.Configuracoes[emp].X509Certificado);
                    //    Components.PCorumbaMS.RecepcionarLoteRpsSincrono dadosEnvio = new Components.PCorumbaMS.RecepcionarLoteRpsSincrono();
                    //    Components.PCorumbaMS.RecepcionarLoteRpsSincronoResponse dadosRetorno = new Components.PCorumbaMS.RecepcionarLoteRpsSincronoResponse();
                    //    dadosEnvio.EnviarLoteRpsSincronoEnvio = docXML.OuterXml.ToString();
                    //    dadosRetorno = ((Components.PCorumbaMS.NfseWSService)servicoWS).RecepcionarLoteRpsSincrono(dadosEnvio);
                    //    strRetorno = dadosRetorno.EnviarLoteRpsSincronoResposta;
                    //}
                    //else
                    //{
                    //    ((Components.HCorumbaMS.NfseWSService)servicoWS).ClientCertificates.Add(Empresas.Configuracoes[emp].X509Certificado);
                    //    Components.HCorumbaMS.RecepcionarLoteRpsSincrono dadosEnvio = new Components.HCorumbaMS.RecepcionarLoteRpsSincrono();
                    //    Components.HCorumbaMS.RecepcionarLoteRpsSincronoResponse dadosRetorno = new Components.HCorumbaMS.RecepcionarLoteRpsSincronoResponse();
                    //    dadosEnvio.EnviarLoteRpsSincronoEnvio = docXML.OuterXml.ToString();
                    //    dadosRetorno = ((Components.HCorumbaMS.NfseWSService)servicoWS).RecepcionarLoteRpsSincrono(dadosEnvio);
                    //    strRetorno = dadosRetorno.EnviarLoteRpsSincronoResposta;
                    //}
                    break;

                    #endregion Recepcionar Lote RPS - Síncrono

                    #region Cancelar RPS

                case Servicos.NFSeCancelar:
                    //if (Empresas.Configuracoes[emp].AmbienteCodigo == (int)TipoAmbiente.taProducao)
                    //{
                    //    ((Components.PCorumbaMS.NfseWSService)servicoWS).ClientCertificates.Add(Empresas.Configuracoes[emp].X509Certificado);
                    //    Components.PCorumbaMS.CancelarNfse dadosEnvio = new Components.PCorumbaMS.CancelarNfse();
                    //    Components.PCorumbaMS.CancelarNfseResponse dadosRetorno = new Components.PCorumbaMS.CancelarNfseResponse();
                    //    dadosEnvio.CancelarNfseEnvio = docXML.OuterXml.ToString();
                    //    dadosRetorno = ((Components.PCorumbaMS.NfseWSService)servicoWS).CancelarNfse(dadosEnvio);
                    //    strRetorno = dadosRetorno.CancelarNfseResposta;
                    //}
                    //else
                    //{
                    //    ((Components.HCorumbaMS.NfseWSService)servicoWS).ClientCertificates.Add(Empresas.Configuracoes[emp].X509Certificado);
                    //    Components.HCorumbaMS.CancelarNfse dadosEnvio = new Components.HCorumbaMS.CancelarNfse();
                    //    Components.HCorumbaMS.CancelarNfseResponse dadosRetorno = new Components.HCorumbaMS.CancelarNfseResponse();
                    //    dadosEnvio.CancelarNfseEnvio = docXML.OuterXml.ToString();
                    //    dadosRetorno = ((Components.HCorumbaMS.NfseWSService)servicoWS).CancelarNfse(dadosEnvio);
                    //    strRetorno = dadosRetorno.CancelarNfseResposta;
                    //}
                    break;

                    #endregion Cancelar RPS

                    #region Consultar Lote RPS

                case Servicos.NFSeConsultarLoteRps:
                    //if (Empresas.Configuracoes[emp].AmbienteCodigo == (int)TipoAmbiente.taProducao)
                    //{
                    //    ((Components.PCorumbaMS.NfseWSService)servicoWS).ClientCertificates.Add(Empresas.Configuracoes[emp].X509Certificado);
                    //    Components.PCorumbaMS.ConsultarLoteRps dadosEnvio = new Components.PCorumbaMS.ConsultarLoteRps();
                    //    Components.PCorumbaMS.ConsultarLoteRpsResponse dadosRetorno = new Components.PCorumbaMS.ConsultarLoteRpsResponse();
                    //    dadosEnvio.ConsultarLoteRpsEnvio = docXML.OuterXml.ToString();
                    //    dadosRetorno = ((Components.PCorumbaMS.NfseWSService)servicoWS).ConsultarLoteRps(dadosEnvio);
                    //    strRetorno = dadosRetorno.ConsultarLoteRpsResposta;
                    //}
                    //else
                    //{
                    //    ((Components.HCorumbaMS.NfseWSService)servicoWS).ClientCertificates.Add(Empresas.Configuracoes[emp].X509Certificado);
                    //    Components.HCorumbaMS.ConsultarLoteRps dadosEnvio = new Components.HCorumbaMS.ConsultarLoteRps();
                    //    Components.HCorumbaMS.ConsultarLoteRpsResponse dadosRetorno = new Components.HCorumbaMS.ConsultarLoteRpsResponse();
                    //    dadosEnvio.ConsultarLoteRpsEnvio = docXML.OuterXml.ToString();
                    //    dadosRetorno = ((Components.HCorumbaMS.NfseWSService)servicoWS).ConsultarLoteRps(dadosEnvio);
                    //    strRetorno = dadosRetorno.ConsultarLoteRpsResposta;
                    //}
                    break;

                    #endregion Consultar Lote RPS

                    #region Consulta Situação Nfse

                case Servicos.NFSeConsultar:
                    //if (Empresas.Configuracoes[emp].AmbienteCodigo == (int)TipoAmbiente.taProducao)
                    //{
                    //    ((Components.PCorumbaMS.NfseWSService)servicoWS).ClientCertificates.Add(Empresas.Configuracoes[emp].X509Certificado);
                    //    Components.PCorumbaMS.ConsultarNfsePorFaixa dadosEnvio = new Components.PCorumbaMS.ConsultarNfsePorFaixa();
                    //    Components.PCorumbaMS.ConsultarNfsePorFaixaResponse dadosRetorno = new Components.PCorumbaMS.ConsultarNfsePorFaixaResponse();
                    //    dadosEnvio.ConsultarNfsePorFaixaEnvio = docXML.OuterXml.ToString();
                    //    dadosRetorno = ((Components.PCorumbaMS.NfseWSService)servicoWS).ConsultarNfsePorFaixa(dadosEnvio);
                    //    strRetorno = dadosRetorno.ConsultarNfsePorFaixaResposta;
                    //}
                    //else
                    //{
                    //    ((Components.HCorumbaMS.NfseWSService)servicoWS).ClientCertificates.Add(Empresas.Configuracoes[emp].X509Certificado);
                    //    Components.HCorumbaMS.ConsultarNfsePorFaixa dadosEnvio = new Components.HCorumbaMS.ConsultarNfsePorFaixa();
                    //    Components.HCorumbaMS.ConsultarNfsePorFaixaResponse dadosRetorno = new Components.HCorumbaMS.ConsultarNfsePorFaixaResponse();
                    //    dadosEnvio.ConsultarNfsePorFaixaEnvio = docXML.OuterXml.ToString();
                    //    dadosRetorno = ((Components.HCorumbaMS.NfseWSService)servicoWS).ConsultarNfsePorFaixa(dadosEnvio);
                    //    strRetorno = dadosRetorno.ConsultarNfsePorFaixaResposta;
                    //}
                    break;

                    #endregion Consulta Situação Nfse

                    #region Consulta Situação Nfse por RPS

                case Servicos.NFSeConsultarPorRps:
                    //if (Empresas.Configuracoes[emp].AmbienteCodigo == (int)TipoAmbiente.taProducao)
                    //{
                    //    ((Components.PCorumbaMS.NfseWSService)servicoWS).ClientCertificates.Add(Empresas.Configuracoes[emp].X509Certificado);
                    //    Components.PCorumbaMS.ConsultarNfsePorRps dadosEnvio = new Components.PCorumbaMS.ConsultarNfsePorRps();
                    //    Components.PCorumbaMS.ConsultarNfsePorRpsResponse dadosRetorno = new Components.PCorumbaMS.ConsultarNfsePorRpsResponse();
                    //    dadosEnvio.ConsultarNfsePorRpsEnvio = docXML.OuterXml.ToString();
                    //    dadosRetorno = ((Components.PCorumbaMS.NfseWSService)servicoWS).ConsultarNfsePorRps(dadosEnvio);
                    //    strRetorno = dadosRetorno.ConsultarNfsePorRpsResposta;
                    //}
                    //else
                    //{
                    //    ((Components.HCorumbaMS.NfseWSService)servicoWS).ClientCertificates.Add(Empresas.Configuracoes[emp].X509Certificado);
                    //    Components.HCorumbaMS.ConsultarNfsePorRps dadosEnvio = new Components.HCorumbaMS.ConsultarNfsePorRps();
                    //    Components.HCorumbaMS.ConsultarNfsePorRpsResponse dadosRetorno = new Components.HCorumbaMS.ConsultarNfsePorRpsResponse();
                    //    dadosEnvio.ConsultarNfsePorRpsEnvio = docXML.OuterXml.ToString();
                    //    dadosRetorno = ((Components.HCorumbaMS.NfseWSService)servicoWS).ConsultarNfsePorRps(dadosEnvio);
                    //    strRetorno = dadosRetorno.ConsultarNfsePorRpsResposta;
                    //}
                    break;

                    #endregion Consulta Situação Nfse por RPS
                }
                break;

                #endregion NA_INFORMATICA

                #region ABASE

            case PadroesNFSe.ABASE:
                if (servicoNFSe == Servicos.NFSeConsultarPorRps)
                {
                    goto default;
                }
                else
                {
                    XmlNode xmlRetorno = wsProxy.InvokeXML(servicoWS, metodo, new object[] { cabecMsg.ToString(), docXML.OuterXml });
                    strRetorno = xmlRetorno.OuterXml;
                }
                break;

                #endregion ABASE

            case PadroesNFSe.LEXSOM:
                XmlNode result = wsProxy.InvokeXML(servicoWS, metodo, new object[] { docXML });
                strRetorno = result.OuterXml;
                break;

            default:

                #region Demais padrões

                if (string.IsNullOrEmpty(cabecMsg))
                {
                    strRetorno = wsProxy.InvokeStr(servicoWS, metodo, new object[] { docXML.OuterXml });
                }
                else
                {
                    strRetorno = wsProxy.InvokeStr(servicoWS, metodo, new object[] { cabecMsg.ToString(), docXML.OuterXml });
                }
                break;

                #endregion Demais padrões
            }

            #region gerar arquivos assinados(somente debug)

#if DEBUG
            string path = Application.StartupPath + "\\teste_assintura\\";

            if (!Directory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }

            StreamWriter sw = new StreamWriter(path + "nfseMsg_assinado.xml", true);
            sw.Write(docXML.OuterXml);
            sw.Close();

            StreamWriter sw2 = new StreamWriter(path + "cabecMsg_assinado.xml", true);
            sw2.Write(cabecMsg.ToString());
            sw2.Close();
#endif

            #endregion gerar arquivos assinados(somente debug)

            //Atualizar o atributo do serviço da Nfe com o conteúdo retornado do webservice do sefaz
            typeServicoNFe.InvokeMember("vStrXmlRetorno", System.Reflection.BindingFlags.SetProperty, null, servicoNFe, new object[] { strRetorno });

            // Registra o retorno de acordo com o status obtido
            if (finalArqEnvio != string.Empty && finalArqRetorno != string.Empty)
            {
                typeServicoNFe.InvokeMember("XmlRetorno", System.Reflection.BindingFlags.InvokeMethod, null, servicoNFe, new Object[] { finalArqEnvio + ".xml", finalArqRetorno + ".xml" });
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Metodo responsável por invocar o serviço do WebService do SEFAZ
        /// </summary>
        /// <param name="oWSProxy">Objeto da classe construida do WSDL</param>
        /// <param name="oServicoWS">Objeto da classe de envio do XML</param>
        /// <param name="cMetodo">Método da classe de envio do XML que faz o envio</param>
        /// <param name="cabecMsg">Objeto da classe de cabecalho do serviço</param>
        /// <param name="oServicoNFe">Objeto do Serviço de envio da NFE do UniNFe</param>
        /// <param name="cFinalArqEnvio">string do final do arquivo a ser enviado. Sem a extensão ".xml"</param>
        /// <param name="cFinalArqRetorno">string do final do arquivo a ser gravado com o conteúdo do retorno. Sem a extensão ".xml"</param>
        /// <remarks>
        /// Autor: Wandrey Mundin Ferreira
        /// Data: 17/03/2010
        /// </remarks>
        public void InvocarNFSe(WebServiceProxy oWSProxy,
                                object oServicoWS,
                                string cMetodo,
                                string cabecMsg,
                                object oServicoNFe,
                                string cFinalArqEnvio,
                                string cFinalArqRetorno,
                                PadroesNFSe padraoNFSe,
                                Servicos servicoNFSe)
        {
            int emp = Empresas.FindEmpresaByThread();

            XmlDocument docXML = new XmlDocument();

            // Definir o tipo de serviço da NFe
            Type typeServicoNFe = oServicoNFe.GetType();

            // Resgatar o nome do arquivo XML a ser enviado para o webservice
            string XmlNfeDadosMsg = (string)(typeServicoNFe.InvokeMember("NomeArquivoXML", System.Reflection.BindingFlags.GetProperty, null, oServicoNFe, null));

            // Exclui o Arquivo de Erro
            Functions.DeletarArquivo(Empresas.Configuracoes[emp].PastaXmlRetorno + "\\" + Functions.ExtrairNomeArq(XmlNfeDadosMsg, cFinalArqEnvio + ".xml") + cFinalArqRetorno + ".err");

            // Validar o Arquivo XML
            ValidarXML validar             = new ValidarXML(XmlNfeDadosMsg, Empresas.Configuracoes[emp].UnidadeFederativaCodigo);
            string     cResultadoValidacao = validar.ValidarArqXML(XmlNfeDadosMsg);

            if (cResultadoValidacao != "")
            {
                switch (padraoNFSe)
                {
                case PadroesNFSe.ISSONLINE4R:
                    break;

                case PadroesNFSe.SMARAPD:
                    break;

                default:
                    throw new Exception(cResultadoValidacao);
                }
            }

            // Montar o XML de Lote de envio de Notas fiscais
            docXML.Load(XmlNfeDadosMsg);

            // Definir Proxy
            if (ConfiguracaoApp.Proxy)
            {
                if (padraoNFSe != PadroesNFSe.BETHA)
                {
                    oWSProxy.SetProp(oServicoWS, "Proxy", Proxy.DefinirProxy(ConfiguracaoApp.ProxyServidor, ConfiguracaoApp.ProxyUsuario, ConfiguracaoApp.ProxySenha, ConfiguracaoApp.ProxyPorta));
                }
                else
                {
                    oWSProxy.Betha.Proxy = Proxy.DefinirProxy(ConfiguracaoApp.ProxyServidor, ConfiguracaoApp.ProxyUsuario, ConfiguracaoApp.ProxySenha, ConfiguracaoApp.ProxyPorta);
                }
            }

            // Limpa a variável de retorno
            string strRetorno = string.Empty;

            //Vou mudar o timeout para evitar que demore a resposta e o uninfe aborte antes de recebe-la. Wandrey 17/09/2009
            //Isso talvez evite de não conseguir o número do recibo se o serviço do SEFAZ estiver lento.
            if (padraoNFSe != PadroesNFSe.BETHA)
            {
                oWSProxy.SetProp(oServicoWS, "Timeout", 120000);
            }

            //Verificar antes se tem conexão com a internet, se não tiver já gera uma exceção no padrão já esperado pelo ERP
            if (ConfiguracaoApp.ChecarConexaoInternet)  //danasa: 12/2013
            {
                if (!Functions.IsConnectedToInternet())
                {
                    //Registrar o erro da validação para o sistema ERP
                    throw new ExceptionSemInternet(ErroPadrao.FalhaInternet, "\r\nArquivo: " + XmlNfeDadosMsg);
                }
            }

            //Invocar o membro
            switch (padraoNFSe)
            {
                #region Padrão BETHA
            case PadroesNFSe.BETHA:
                switch (cMetodo)
                {
                case "ConsultarSituacaoLoteRps":
                    strRetorno = oWSProxy.Betha.ConsultarSituacaoLoteRps(docXML, Empresas.Configuracoes[emp].AmbienteCodigo);
                    break;

                case "ConsultarLoteRps":
                    strRetorno = oWSProxy.Betha.ConsultarLoteRps(docXML, Empresas.Configuracoes[emp].AmbienteCodigo);
                    break;

                case "CancelarNfse":
                    strRetorno = oWSProxy.Betha.CancelarNfse(docXML, Empresas.Configuracoes[emp].AmbienteCodigo);
                    break;

                case "ConsultarNfse":
                    strRetorno = oWSProxy.Betha.ConsultarNfse(docXML, Empresas.Configuracoes[emp].AmbienteCodigo);
                    break;

                case "ConsultarNfsePorRps":
                    strRetorno = oWSProxy.Betha.ConsultarNfsePorRps(docXML, Empresas.Configuracoes[emp].AmbienteCodigo);
                    break;

                case "RecepcionarLoteRps":
                    strRetorno = oWSProxy.Betha.RecepcionarLoteRps(docXML, Empresas.Configuracoes[emp].AmbienteCodigo);
                    break;
                }
                break;
                #endregion

                #region Padrão ISSONLINE
            case PadroesNFSe.ISSONLINE:
                int    operacao;
                string senhaWs = Functions.GetMD5Hash(Empresas.Configuracoes[emp].SenhaWS);

                switch (servicoNFSe)
                {
                case Servicos.NFSeRecepcionarLoteRps:
                    operacao = 1;
                    break;

                case Servicos.NFSeCancelar:
                    operacao = 2;
                    break;

                default:
                    operacao = 3;
                    break;
                }

                strRetorno = oWSProxy.InvokeStr(oServicoWS, cMetodo, new object[] { Convert.ToSByte(operacao), Empresas.Configuracoes[emp].UsuarioWS, senhaWs, docXML.OuterXml });
                break;
                #endregion

                #region Padrão Blumenau-SC
            case PadroesNFSe.BLUMENAU_SC:
                strRetorno = oWSProxy.InvokeStr(oServicoWS, cMetodo, new object[] { 1, docXML.OuterXml });
                break;
                #endregion

                #region Padrão Paulistana
            case PadroesNFSe.PAULISTANA:
                strRetorno = oWSProxy.InvokeStr(oServicoWS, cMetodo, new object[] { 1, docXML.OuterXml });
                break;
                #endregion

                #region Demais padrões
            case PadroesNFSe.TECNOSISTEMAS:
                strRetorno = oWSProxy.InvokeStr(oServicoWS, cMetodo, new object[] { docXML.OuterXml, cabecMsg.ToString() });
                break;

            case PadroesNFSe.SMARAPD:
                if (cMetodo == "nfdEntradaCancelar")
                {
                    strRetorno = oWSProxy.InvokeStr(oServicoWS, cMetodo, new object[] { Empresas.Configuracoes[emp].UsuarioWS,
                                                                                        TFunctions.EncryptSHA1(Empresas.Configuracoes[emp].SenhaWS),
                                                                                        docXML.OuterXml });
                }
                else
                {
                    strRetorno = oWSProxy.InvokeStr(oServicoWS, cMetodo, new object[] { Empresas.Configuracoes[emp].UsuarioWS,
                                                                                        TFunctions.EncryptSHA1(Empresas.Configuracoes[emp].SenhaWS),
                                                                                        Empresas.Configuracoes[emp].UnidadeFederativaCodigo,
                                                                                        docXML.OuterXml });
                }
                break;

            case PadroesNFSe.ISSWEB:
                string versao = docXML.DocumentElement.GetElementsByTagName("Versao")[0].InnerText;
                string cnpj   = docXML.DocumentElement.GetElementsByTagName("CNPJCPFPrestador")[0].InnerText;
                strRetorno = oWSProxy.InvokeStr(oServicoWS, cMetodo, new object[] { cnpj, docXML.OuterXml, versao });
                break;

            case PadroesNFSe.GINFES:
            case PadroesNFSe.THEMA:
            case PadroesNFSe.SALVADOR_BA:
            case PadroesNFSe.CANOAS_RS:
            case PadroesNFSe.ISSNET:
            default:
                if (string.IsNullOrEmpty(cabecMsg))
                {
                    strRetorno = oWSProxy.InvokeStr(oServicoWS, cMetodo, new object[] { docXML.OuterXml });
                }
                else
                {
                    strRetorno = oWSProxy.InvokeStr(oServicoWS, cMetodo, new object[] { cabecMsg.ToString(), docXML.OuterXml });
                }
                break;
                #endregion
            }
            #region gerar arquivos assinados(somente debug)
#if DEBUG
            string path = Application.StartupPath + "\\teste_assintura\\";

            if (!Directory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }

            StreamWriter sw = new StreamWriter(path + "nfseMsg_assinado.xml", true);
            sw.Write(docXML.OuterXml);
            sw.Close();

            StreamWriter sw2 = new StreamWriter(path + "cabecMsg_assinado.xml", true);
            sw2.Write(cabecMsg.ToString());
            sw2.Close();
#endif
            #endregion

            //Atualizar o atributo do serviço da Nfe com o conteúdo retornado do webservice do sefaz
            typeServicoNFe.InvokeMember("vStrXmlRetorno", System.Reflection.BindingFlags.SetProperty, null, oServicoNFe, new object[] { strRetorno });

            // Registra o retorno de acordo com o status obtido
            if (cFinalArqEnvio != string.Empty && cFinalArqRetorno != string.Empty)
            {
                typeServicoNFe.InvokeMember("XmlRetorno", System.Reflection.BindingFlags.InvokeMethod, null, oServicoNFe, new Object[] { cFinalArqEnvio + ".xml", cFinalArqRetorno + ".xml" });
            }
        }