ZeusAutomacao/DFe.NET

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:
image

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?

@caserlucas

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

@caserlucas

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