/// <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> /// <param name="gravaRetorno">Grava o arquivo de retorno para o ERP na execução deste método?</param> public void Invocar(WebServiceProxy wsProxy, object servicoWS, string metodo, object cabecMsg, object servicoNFe, string finalArqEnvio, string finalArqRetorno, bool gravaRetorno, 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(); Servicos servico = (Servicos)wsProxy.GetProp(servicoNFe, NFeStrConstants.Servico); docXML = (XmlDocument)(typeServicoNFe.InvokeMember("ConteudoXML", System.Reflection.BindingFlags.GetField, null, servicoNFe, null)); // 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"); if (docXML == null) { docXML.Load(XmlNfeDadosMsg); } // Validar o Arquivo XML switch (servico) { case Servicos.NFeEnviarLote: case Servicos.NFeEnviarLoteZip: case Servicos.CTeEnviarLote: case Servicos.MDFeEnviarLote: //XML de NFe, CTe e MDFe, na montagem do lote eu valido o XML antes, como o lote quem monta é o XML entendo que não está montando errado, sendo assim, não vou validar novamente o XML para ganhar desempenho. Wandrey 18/09/2016 break; default: ValidarXML validar = new ValidarXML(docXML, Empresas.Configuracoes[emp].UnidadeFederativaCodigo, false); string cResultadoValidacao = validar.ValidarArqXML(docXML, XmlNfeDadosMsg); if (cResultadoValidacao != "") { throw new Exception(cResultadoValidacao); } break; } // Definir Proxy if (ConfiguracaoApp.Proxy) { wsProxy.SetProp(servicoWS, "Proxy", Proxy.DefinirProxy(ConfiguracaoApp.ProxyServidor, ConfiguracaoApp.ProxyUsuario, ConfiguracaoApp.ProxySenha, ConfiguracaoApp.ProxyPorta, ConfiguracaoApp.DetectarConfiguracaoProxyAuto)); } // Limpa a variável de retorno XmlNode XmlRetorno = null; 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. wsProxy.SetProp(servicoWS, "Timeout", 60000); if (cabecMsg != null) { switch (servico) { case Servicos.MDFePedidoConsultaSituacao: case Servicos.MDFePedidoSituacaoLote: case Servicos.MDFeEnviarLote: case Servicos.MDFeConsultaStatusServico: case Servicos.MDFeRecepcaoEvento: case Servicos.MDFeConsultaNaoEncerrado: wsProxy.SetProp(servicoWS, "mdfeCabecMsgValue", cabecMsg); break; case Servicos.CTeInutilizarNumeros: case Servicos.CTePedidoConsultaSituacao: case Servicos.CTePedidoSituacaoLote: case Servicos.CTeEnviarLote: case Servicos.CTeRecepcaoEvento: case Servicos.CTeConsultaStatusServico: case Servicos.CteRecepcaoOS: if (wsProxy.GetProp(cabecMsg, TpcnResources.cUF.ToString()).ToString() == "50") //Mato Grosso do Sul fugiu o padrão nacional { try { wsProxy.SetProp(servicoWS, "cteCabecMsg", cabecMsg); } catch //Se der erro é pq não está no ambiente normal então tem que ser o nome padrão pois Mato Grosso do Sul fugiu o padrão nacional. { wsProxy.SetProp(servicoWS, "cteCabecMsgValue", cabecMsg); } } else { wsProxy.SetProp(servicoWS, "cteCabecMsgValue", cabecMsg); } break; case Servicos.CTeDistribuicaoDFe: case Servicos.DFeEnviar: break; case Servicos.LMCAutorizacao: break; default: wsProxy.SetProp(servicoWS, "nfeCabecMsgValue", cabecMsg); break; } } //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; // Envio da NFe Compactada - Renan if (servico == Servicos.NFeEnviarLoteZip) { string encodedData = TFunctions.CompressXML(docXML); XmlRetorno = wsProxy.InvokeXML(servicoWS, metodo, new object[] { encodedData }); } else { XmlRetorno = wsProxy.InvokeXML(servicoWS, metodo, new object[] { docXML }); } if (XmlRetorno == null) { throw new Exception("Erro de envio da solicitação do serviço: " + servico.ToString()); } typeServicoNFe.InvokeMember("vStrXmlRetorno", System.Reflection.BindingFlags.SetProperty, null, servicoNFe, new object[] { XmlRetorno.OuterXml }); // Registra o retorno de acordo com o status obtido if (gravaRetorno) { typeServicoNFe.InvokeMember("XmlRetorno", System.Reflection.BindingFlags.InvokeMethod, null, servicoNFe, new Object[] { finalArqEnvio + ".xml", finalArqRetorno + ".xml" }); } }
/// <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 Invocar(WebServiceProxy oWSProxy, object oServicoWS, string cMetodo, object cabecMsg, object oServicoNFe, string cFinalArqEnvio, string cFinalArqRetorno) { int emp = Empresas.FindEmpresaByThread(); XmlDocument docXML = new XmlDocument(); // Definir o tipo de serviço da NFe Type typeServicoNFe = oServicoNFe.GetType(); Servicos servico = (Servicos)oWSProxy.GetProp(oServicoNFe, NFe.Components.NFeStrConstants.Servico); // 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 != "") { throw new Exception(cResultadoValidacao); } // Montar o XML de Lote de envio de Notas fiscais docXML.Load(XmlNfeDadosMsg); // Definir Proxy if (ConfiguracaoApp.Proxy) { oWSProxy.SetProp(oServicoWS, "Proxy", Proxy.DefinirProxy(ConfiguracaoApp.ProxyServidor, ConfiguracaoApp.ProxyUsuario, ConfiguracaoApp.ProxySenha, ConfiguracaoApp.ProxyPorta)); } // Limpa a variável de retorno XmlNode XmlRetorno = null; 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. oWSProxy.SetProp(oServicoWS, "Timeout", 60000); //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) { if (!Functions.IsConnectedToInternet()) { //Registrar o erro da validação para o sistema ERP throw new ExceptionSemInternet(ErroPadrao.FalhaInternet, "\r\nArquivo: " + XmlNfeDadosMsg); } } //Atribuir conteúdo para uma propriedade da classe NfeStatusServico2 if (cMetodo.Substring(0, 3).ToLower() == "sce") // DPEC { oWSProxy.SetProp(oServicoWS, "sceCabecMsgValue", cabecMsg); } else { switch (servico) { case Servicos.MDFePedidoConsultaSituacao: case Servicos.MDFePedidoSituacaoLote: case Servicos.MDFeEnviarLote: case Servicos.MDFeConsultaStatusServico: case Servicos.MDFeRecepcaoEvento: case Servicos.MDFeConsultaNaoEncerrado: oWSProxy.SetProp(oServicoWS, "mdfeCabecMsgValue", cabecMsg); break; case Servicos.CTeInutilizarNumeros: case Servicos.CTePedidoConsultaSituacao: case Servicos.CTePedidoSituacaoLote: case Servicos.CTeEnviarLote: case Servicos.CTeRecepcaoEvento: case Servicos.CTeConsultaStatusServico: if (oWSProxy.GetProp(cabecMsg, NFe.Components.TpcnResources.cUF.ToString()).ToString() == "50") //Mato Grosso do Sul fugiu o padrão nacional { try { oWSProxy.SetProp(oServicoWS, "cteCabecMsg", cabecMsg); } catch //Se der erro é pq não está no ambiente normal então tem que ser o nome padrão pois Mato Grosso do Sul fugiu o padrão nacional. { oWSProxy.SetProp(oServicoWS, "cteCabecMsgValue", cabecMsg); } } else { oWSProxy.SetProp(oServicoWS, "cteCabecMsgValue", cabecMsg); } break; case Servicos.DFeEnviar: break; /*default: * oWSProxy.SetProp(oServicoWS, "nfeCabecMsgValue", cabecMsg); * break;*/ } } // Envio da NFe Compactada - Renan if (servico == Servicos.NFeEnviarLoteZip2) { XmlNfeDadosMsg = XmlNfeDadosMsg + ".gz"; FileInfo XMLNfeZip = new FileInfo(XmlNfeDadosMsg); string encodedData = StreamExtensions.ToBase64(XMLNfeZip); XmlRetorno = oWSProxy.InvokeXML(oServicoWS, cMetodo, new object[] { encodedData }); } else { XmlRetorno = oWSProxy.InvokeXML(oServicoWS, cMetodo, new object[] { docXML }); } if (XmlRetorno == null) { throw new Exception("Erro de envio da solicitação do serviço: " + servico.ToString()); } typeServicoNFe.InvokeMember("vStrXmlRetorno", System.Reflection.BindingFlags.SetProperty, null, oServicoNFe, new object[] { XmlRetorno.OuterXml }); // 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" }); } }