none
O servidor remoto retornou um erro: (400) Solicitação Incorreta RRS feed

  • Pergunta

  • Boa tarde a todos,

    Criei dois métodos, um para autenticação via certificado do tipo A1 e A3 e outro para enviar um xml, ambos fazem a requisição em uma api rest do cliente.

    No método de autenticação, envio os dados do meu certificado para o cliente e tenho o retorno de um "Set-Token" com informações do usuário, "X-CSRF-Token" Token de prevenção contra ataques CSRF e "X-CSRF-Expiration" com a data de expiração.

    Método de autenticação.

    public void CarregaCertificado()
            {
    
                string destinationUrl = "https://val.portalunico.siscomex.gov.br/portal/api/autenticar";
                string requestXml = "Aqui é a string do xml";
    
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(destinationUrl);
    
                X509Certificate2 oCertificado;
                var oX509Cert = new X509Certificate2();
                var store = new X509Store("MY", StoreLocation.CurrentUser);
                store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
                var collection = store.Certificates;
    
                var collection2 = collection.Find(X509FindType.FindByKeyUsage, X509KeyUsageFlags.DigitalSignature, false);
                var scollection = X509Certificate2UI.SelectFromCollection(collection2,
                  "Certificado(s) Digital(is) disponível(is)", "Selecione o certificado digital para uso no aplicativo",
                   X509SelectionFlag.SingleSelection);
    
    
                if (scollection.Count == 0)
                {
                    var msgResultado =
                        "Nenhum certificado digital foi selecionado ou o certificado selecionado está com problemas.";
                    MessageBox.Show(msgResultado, "Advertência", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
                else
                {
                    oX509Cert = scollection[0];
                    oCertificado = oX509Cert;
                    request.ClientCertificates.Add(oCertificado);
    
    
                    request.ContentType = "application/json";
                    request.Headers.Add("Role-Type", "DEPOSIT");
    
                    request.Method = "POST";
    
                    HttpWebResponse response;
                    response = (HttpWebResponse)request.GetResponse();
    
                    string tokenResponse = string.Empty;
                    string csrfTokenResponse = string.Empty;
                    string csrfExpirionResponse = string.Empty;
                    string keepAlive = string.Empty;
                    string connection = string.Empty;
                    string contentLength = string.Empty;
                    string contentType = string.Empty;
                    string date = string.Empty;
                    string server = string.Empty;
    
    
                    if (response.StatusCode == HttpStatusCode.OK)
                    {
                        Stream responseStream = response.GetResponseStream();
    
                        tokenResponse = response.Headers["Set-Token"];
                        csrfTokenResponse = response.Headers["X-CSRF-Token"];
                        csrfExpirionResponse = response.Headers["X-CSRF-Expiration"];
                        keepAlive = response.Headers["Keep-Alive"];
                        connection = response.Headers["Connection"];
                        contentLength = response.Headers["Content-Length"];
                        contentType = response.Headers["Content-Type"];
                        date = response.Headers["Date"];
                        server = response.Headers["Server"];
    
    
    
                        string responseStr = new StreamReader(responseStream).ReadToEnd();
    
                    }
    
                   EnvioXML(requestXml, tokenResponse, csrfTokenResponse, csrfExpirionResponse);
    
                }
            }

    Recebo os dados após autenticação sem problemas!

    Depois tento enviar o xml.

    Método de envio do xml

    public void EnvioXML(string requestXml, string tokenResponse, string csrfTokenResponse, string csrfExpirionResponse)
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://val.portalunico.siscomex.gov.br/cct/api/ext/carga/entrega-conteiner");
                byte[] bytes;
                bytes = System.Text.Encoding.UTF8.GetBytes(requestXml);
    
                request.ContentType = "application/xml";
    
                request.Headers.Add("Authorization", tokenResponse);
    
                request.Headers.Add("X-CSRF-Token", csrfTokenResponse);           
    
                request.ContentLength = bytes.Length;
    
                request.ContentLength = 1;
                request.SendChunked = true;
                request.Method = "POST";           
    
                Stream requestStream = request.GetRequestStream();
                requestStream.Write(bytes, 0, bytes.Length);
                requestStream.Close();
    
                try
                {
                    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                    {
                        if (response.StatusCode == HttpStatusCode.OK)
                        {
                            Stream responseStream1 = response.GetResponseStream();
                        }
                    }
                }
                catch (WebException e)
                {
    
                    MessageBox.Show(e.Message);
                }
    
            }

    ai da o erro 

    O servidor remoto retornou um erro: (400) Solicitação Incorreta

    Desde já muito obrigado!

    sexta-feira, 27 de abril de 2018 18:46

Todas as Respostas

  • Boa tarde, Marcio Camargo. Tudo bem?

    Obrigado por usar o fórum Technet.

    Conseguiu algum avanço no teu caso?

    Se ainda não, o que falta?

    Atenciosamente,

    Filipe B de Castro

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    segunda-feira, 30 de abril de 2018 17:31
    Moderador
  • Boa tarde,

    Não consegui nenhum avanço, estou parado no mesmo ponto.

    Estou no aguardo de alguma colaboração de algum colaborador.



    segunda-feira, 30 de abril de 2018 19:56
  • Olá, substitua o header authorization por este e veja se funciona.
    request.Headers.Add(HttpRequestHeader.Authorization, tokenResponse);

    Abs!


    Leandro de Agostini MCTS - Web Application, Framework 4

    terça-feira, 1 de maio de 2018 14:56
  • Bom dia Leandro,

    Muito obrigado pelo retorno.

    Fiz a alteração conforme solicitado, mais apresentou o mesmo erro!

    Att,

    quarta-feira, 2 de maio de 2018 12:12