Boa tarde! Estou tentando enviar os novos eventos do REINF. Sempre apresenta erro: A solicitação foi anulada: Não foi possível criar um canal seguro para SSL/TLS. Alguém consegue me ajudar?
Código C# abaixo:
var handler = new WebRequestHandler();
handler.ClientCertificates.Add(cert);
HttpClient client;
client = new HttpClient(handler);
client.BaseAddress = new Uri(“https://pre-reinf.receita.economia.gov.br/recepcao/lotes”);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(“application/xml”));
try
{
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
var httpContent = new StringContent(elemDoc.ToString(), Encoding.UTF8, “application/xml”);
HttpResponseMessage response = await client.PostAsync(client.BaseAddress.ToString(), httpContent);
ret._RetornoExecucao = true;
ret._MessagemErro = response.StatusCode.ToString();
return ret;
}
catch (Exception ex)
{
ret._RetornoExecucao = false;
ret._MessagemErro = ex.ToString();
ret.xdoc = null;
return ret;
}
Guilherme, não do XML de retorno, é quando entra catch (Exception ex), ele retorna erro “422 Lote não foi recebido pois possui inconsistências. No body é retornado o XML com as
ocorrências a serem resolvidas pela instituição declarante”, gostaria pegar os detalhes. Não acho esse body na var de retorno.
Segue código em RestSharp que está funcionando, para ficar aqui registrado:
public Entity.RetornoDAEnt EnvioXMLRestSharp(string filePath, X509Certificate2 digitalCertificate)
{
Entity.RetornoDAEnt ret = new Entity.RetornoDAEnt();
XElement elemDoc = null;
XmlDocument xmlDoc = new XmlDocument();
try
{
elemDoc = XElement.Load(filePath); //certo é converter
xmlDoc.Load(filePath);
}
catch (Exception ex)
{
ret._RetornoExecucao = false;
ret._MessagemErro = “Validação de Esquema: ” + ex.Message;
ret.xdoc = null;
return ret;
}
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11;
Uri uri = new Uri(“https://pre-reinf.receita.economia.gov.br/recepcao/lotes”);
var options = new RestClientOptions(uri);
options.ClientCertificates = new X509CertificateCollection() { digitalCertificate };
var client = new RestClient(options);
var request = new RestRequest(uri, Method.Post);
request.RequestFormat = DataFormat.Xml;
request.AddParameter(“application/xml”, elemDoc, ParameterType.RequestBody);
//RestResponse response = new RestResponse();
try
{
var response = client.ExecutePost(request);
//response = client.Post(request);
if (response.IsSuccessful)
{
ret._RetornoExecucao = true;
}
else
{
ret._RetornoExecucao = false;
ret._MessagemErro = response.ErrorException.ToString();
}
XmlDocument xmlDocRet = new XmlDocument();
xmlDocRet.LoadXml(response.Content.ToString());
ret.xdoc = xmlDocRet;
}
catch (HttpRequestException ex)
{
ret._RetornoExecucao = false;
ret._MessagemErro = ex.Message + ex.InnerException;
}
return ret;
}
Só tenha atenção ao protocolo TLS
http://sped.rfb.gov.br/pagina/show/7280
As informações referentes a erros no lote estão na tag ocorrencia.
As informações referentes a erros nos eventos no xml de retorno ficam na tag regOcorrs.
Na documentação voce encotra o leiaute dos xmls de retorno.
Muitíssimo obrigada! Funcionou! Vou deixar o meu aqui também para ajudar outras pessoas. Mais uma coisa se puder ajudar, como pego a descrição do erro no XML? Você fez isso?
Entity.RetornoDAEnt ret = new Entity.RetornoDAEnt();
XElement elemDoc = null;
XmlDocument xmlDoc = new XmlDocument();
try
{
elemDoc = XElement.Load(filePath);
xmlDoc.Load(filePath);
}
catch (Exception ex)
{
ret._RetornoExecucao = false;
ret._MessagemErro = “Validação de Esquema: ” + ex.Message;
ret.xdoc = null;
return ret;
}
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11;
Uri uri = new Uri(“https://pre-reinf.receita.economia.gov.br/recepcao/lotes”);
var options = new RestClientOptions(uri);
options.ClientCertificates = new X509CertificateCollection() { digitalCertificate };
var client = new RestClient(options);
var request = new RestRequest(uri, Method.Post);
request.RequestFormat = DataFormat.Xml;
request.AddParameter(“application/xml”, elemDoc, ParameterType.RequestBody);
try
{
var response = client.Post(request);
if (response.IsSuccessful)
{
ret._RetornoExecucao = true;
}
else
{
ret._RetornoExecucao = false;
ret._MessagemErro = response.ErrorMessage;
}
}
catch (Exception ex)
{
ret._RetornoExecucao = false;
ret._MessagemErro = ex.Message + ex.InnerException;
}
return ret;
Exemplo utilizando RestSharp:
var client = new RestClient(uri);
client.ClientCertificates = new X509CertificateCollection() { certificate };
var request = new RestRequest(Method.POST);
request.RequestFormat = DataFormat.Xml;
request.AddParameter(“application/xml”, xmlLote, ParameterType.RequestBody);
var response = client.Post(request);