Estou desenvolvendo uma aplicação usando c# para envio da NFS-e e estou recebendo a seguinte mensagem de erro ao enviar o lote RPS:
A mensagem XML do cabeçalho do arquivo enviado está fora do padrão especificado.
Pelas pesquisas que fiz, para o município de Vitória não há cabeçalho, bem como, estou inserindo o endereço em Adicionar Referência de Serviço / Avançado / Adicionar Referência web e ainda assim eu recebo a mesma mensagem de erro.
Segue abaixo meu código para que alguém possa dar olhada.
ES_Vitoria.NotaFiscalService servico = new ES_Vitoria.NotaFiscalService();
servico.PreAuthenticate = true;
servico.ClientCertificates.Add(cert);
MsgRetorno = (string)servico.RecepcionarLoteRpsSincrono(StrXML);
XmlDocument doc = new XmlDocument();
doc.LoadXml(MsgRetorno);
doc.Save(@"D:\NFSe\MensagemDeRetorno.xml");
Eu uso uma classe intermediária para corrigir o erro do C# com os webservices brasileiros.
#region
//Classes Auxiliares para adicionar o Certificado a Requisição
public class WS_3205200A_Custom : WS_3205200A.NotaFiscalService
{
private HttpStatusCode cLastCode;
private X509Certificate2 cCertificado;
public X509Certificate2 Certificado
{
get { return cCertificado; }
set { cCertificado = value; }
}
public HttpStatusCode lastCode { get { return cLastCode; } }
public WS_3205200A_Custom(
X509Certificate2 pCertificado,
string pUrl)
{
Certificado = pCertificado;
Url = pUrl;
}
// Override para informar o certificado
protected override System.Net.WebRequest GetWebRequest(Uri uri)
{
// instanciar o objeto de requisição para a Url informada no construtor da classe
System.Net.WebRequest wr = System.Net.WebRequest.Create(new Uri(Url));
System.Net.HttpWebRequest hr = ((System.Net.HttpWebRequest)wr);
// incluir o certificado digital na requisição
hr.ClientCertificates.Clear();
if (cCertificado != null)
hr.ClientCertificates.Add(cCertificado);
hr.PreAuthenticate = true;
hr.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateRemoteCertificate);
return wr;
}
// Guardar o ultimo StatusCode
protected override System.Net.WebResponse GetWebResponse(System.Net.WebRequest request)
{
System.Net.WebResponse wr = base.GetWebResponse(request);
System.Net.HttpWebResponse hr = ((System.Net.HttpWebResponse)wr);
cLastCode = hr.StatusCode;
return wr;
}
// Callback usado para validar o certificate com a SSL conversation
private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors policyErrors)
{
return true;
}
}
#endregion
Com isso eu chamo assim:
WS_3205200A_Custom ws1 = new WS_3205200A_Custom(cert, "https://issonline.vilavelha.es.gov.br/SistemaIss/WebService/NotaFiscalService.asmx");
string s = "";
s = this.asXML();
s = ws1.GerarNfse(s);