Classe MDFeConfiguracao com propriedades estáticas
Opened this issue · 7 comments
Estou fazendo integração com a lib de vocês, me chamou muita atenção porém meu projeto é um projeto web, onde terão vários clientes utilizando, de empresas diferentes e eu vi que a classe de configuração para uso do MDFe possui propriedades estáticas:
Fiz um breve teste aqui com requisições simultâneas e a segunda requisição sobreescreve configurações da primeira, gerando problema de "concorrência".
Foi algo proposital as propriedades serem estáticas?
Existe forma de contornar isso?
Foi algo proposital as propriedades serem estáticas?
O código do MDFe não deveria estar estático, mas foi como doaram para gente à epoca (se não me engano quem fez a doação foi o @robertorp) e depois disso ninguém alterou.
Existe forma de contornar isso?
Sim, implementar a comunicação na unha. Eu faço isso na minha aplicação. Exemplo emitir:
using ZeusMDfe = MDFe.Classes.Informacoes.MDFe;
using ZeusMDFeRetEnviMDFe = MDFe.Classes.Retorno.MDFeRecepcao.MDFeRetEnviMDFe;
using ZeusEnviMdfe = MDFe.Classes.Servicos.Autorizacao.MDFeEnviMDFe;
using ZeusFuncoesXml = DFe.Utils.FuncoesXml;
using ZeusMdfeConfiguracao = MDFe.Utils.Configuracoes.MDFeConfiguracao;
using ZeusMdfeRecepcao = MDFe.Wsdl.MDFeRecepcao.MDFeRecepcao;
private ZeusMDFeRetEnviMDFe Enviar(List<ZeusMDfe> zmdfes)
{
ZeusMDFeRetEnviMDFe retornoEnvio = null;
//monta o objeto de envio do lote
var enviMdfe = new ZeusEnviMdfe()
{
IdLote = "1",
Versao = zmdfes.First().InfMDFe.Versao,
MDFe = zmdfes.First()
};
//salva o xml do envio na pasta antes de enviar
string xmlenvio = ZeusFuncoesXml.ClasseParaXmlString(enviMdfe);
File.WriteAllText(Path.Combine(ZeusMdfeConfiguracao.CaminhoSalvarXml, $"{enviMdfe.MDFe.InfMDFe.Id.OnlyNumber()}-mdfe.xml"), xmlenvio);
//Faz o envio para a sefaz e joga o retonro na variável retornoEnvio
using (var _certificado = Nfe.GetCertificado(ZeusMdfeConfiguracao.ConfiguracaoCertificado))
{
var servicoRecepcao = new ZeusMdfeRecepcao(new CTe.CTeOSDocumento.Common.WsdlConfiguracao()
{
CertificadoDigital = _certificado,
CodigoIbgeEstado = Convert.ToInt32(ZeusMdfeConfiguracao.VersaoWebService.UfEmitente).ToString(),
TimeOut = ZeusMdfeConfiguracao.VersaoWebService.TimeOut,
Versao = versaostring,
Url = ZeusUrlHelper.ObterUrlServico(ZeusMdfeConfiguracao.VersaoWebService.TipoAmbiente).MDFeRecepcao
});
var retornoXml = servicoRecepcao.mdfeRecepcaoLote(ZeusExtMDFeEnviMDFe.CriaXmlRequestWs(enviMdfe));
retornoEnvio = ZeusMDFeRetEnviMDFe.LoadXml(retornoXml.OuterXml, enviMdfe);
}
return retornoEnvio;
}
Para o GetCertificado eu uso o OpenAC.Net.DFe.Core para recuperar o X509Certificate2.
using ZeusConfigCertificado = DFe.Utils.ConfiguracaoCertificado;
using ZeusTipoCertificado = DFe.Utils.TipoCertificado;
public static System.Security.Cryptography.X509Certificates.X509Certificate2 GetCertificado(ZeusConfigCertificado configuracao)
{
System.Security.Cryptography.X509Certificates.X509Certificate2 certificado;
switch (configuracao.TipoCertificado)
{
case ZeusTipoCertificado.A1Repositorio:
case ZeusTipoCertificado.A3:
return OpenAC.Net.DFe.Core.CertificadoDigital.SelecionarCertificado(configuracao.Serial);
case ZeusTipoCertificado.A1ByteArray:
return OpenAC.Net.DFe.Core.CertificadoDigital.SelecionarCertificado(configuracao.ArrayBytesArquivo, configuracao.Senha);
default:
throw new ArgumentException($"Tipo de certificado \"{configuracao.TipoCertificado.GetEnumDescription()}\" não implementado");
}
}
Fica inviável a implementação na unha, gostaria de uma lib para comunicação com sefaz. Inicialmente somente MDF-e, porém o desejo e implementar NF-e, NFC-e, CT-e...
Eu dediquei um tempo para implementar o uso do código MDF-e via instância de classe, tanto que abri um PR. Se possível verificar a viabilidade. Não modifiquei nenhum comportamento atual, eu apenas estendi o uso por meio de instância
Eu não tinha visto seu PR, obviamente a solução direto na a ferramenta nesse caso é melhor!
Obrigado pela colaboração
Boa tarde pessoal, estou implementando o MDF-e em um sistema web multi-tenant e me deparei com o mesmo problema do colega @caserlucas
Estou usando a versão disponivel no Nu.get, poderiam me informar se esse pull request foi incorporado ao codigo?
Caso sim, alguma previsao de ir para versão do nu.get ou seria melhor compilar o código e usar as libs?
@marcianobandeira o @caserlucas ficou de mandar um pullrequest pra gente #1424 (comment)
@marcianobandeira
seria melhor compilar o código e usar as libs?
melhor é sempre utilizar o nuget, pois hoje ele é lançado ao mesmo tempo em minutos de forma automática
Obrigado @danilobreda, vou tentar conforme sugeriu o colega @marcosgerene