Invio fattura elettronica - Internal Error

Buongiorno a tutti,
sto eseguendo i primi test per l’invio della fattura elettronica, ma purtroppo al primo tentativo mi sono arenato a causa di un generico errore interno.
Nel dettaglio il codice che utilizzo è il seguente:

static void Main(string[] args) {
FatturaPA_SdIRiceviFile.SdIRiceviFileClient srv = new FatturaPA_SdIRiceviFile.SdIRiceviFileClient();
FatturaPA_SdIRiceviFile.RiceviFileRequest srvReq = new FatturaPA_SdIRiceviFile.RiceviFileRequest();
FatturaPA_SdIRiceviFile.RiceviFileResponse srvResp = new FatturaPA_SdIRiceviFile.RiceviFileResponse();

EndpointAddress address = new EndpointAddress(new Uri(“https://testservizi.fatturapa.it/ricevi_file”));
Binding binding = CreateMultiFactorAuthenticationBinding();
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
X509Certificate2 certificate = new X509Certificate2(@“percorso certificato pfx”, “…”);

var factory = new ChannelFactory<FatturaPA_SdIRiceviFile.SdIRiceviFileChannel>(binding, address);
factory.Credentials.ClientCertificate.Certificate = certificate;
factory.Endpoint.Contract.ProtectionLevel = ProtectionLevel.Sign;
factory.Credentials.ServiceCertificate.DefaultCertificate = new X509Certificate2(@“percorso certificato testservizi.fatturapa.it.cer”);
factory.Credentials.ServiceCertificate.SslCertificateAuthentication = new X509ServiceCertificateAuthentication {
CertificateValidationMode = X509CertificateValidationMode.None,
RevocationMode = X509RevocationMode.NoCheck
};

FatturaPA_SdIRiceviFile.SdIRiceviFileChannel channel = factory.CreateChannel();
try {
srvReq.fileSdIAccoglienza = new FatturaPA_SdIRiceviFile.fileSdIBase_Type();

byte[] f = File.ReadAllBytes(@“percorso file xml firmato p7m”);
srvReq.fileSdIAccoglienza.File = Convert.FromBase64String(Convert.ToBase64String(f, 0, f.Length));
srvReq.fileSdIAccoglienza.NomeFile = “nome file firmato”;

srvResp = channel.RiceviFile(srvReq);
} catch (Exception exc) {
Console.WriteLine(exc.ToString());
}
Console.ReadLine();
}

L’errore avviene in corrispondenza della chiamata channel.RiceviFile(srvReq), nel dettaglio l’errore è il seguente:

System.ServiceModel.FaultException: Internal Error

Server stack trace:
in System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc)
in System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
in System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
in System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Exception rethrown at [0]:
in System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
in System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
in TestFatturaPA.FatturaPA_SdIRiceviFile.SdIRiceviFile.RiceviFile(RiceviFileRequest request)
in TestFatturaPA.Program.Main(String[] args)

Qualcuno ha suggerimento in merito?

Ciao anche io ho lo stesso problema, tu hai risolto?
Grazie

Risolto!
Bastava attivare l’Mtom

“binding.MessageEncoding = WSMessageEncoding.Mtom;”

1 Mi Piace

Puoi inviarmi il tuo codice? È nel mio caso che dà errore in questa riga di codice che ha scritto.

Adesso riesco a trasmettere i documenti, ricevo le notifiche, ma non ricevo le fatture.
Questo è l’errore su gestione canale:
“javax.xml.stream.XMLStreamException: com.ibm.ws.websvcs.transport.http.out.ClosedConnectionException: OutputStream encountered error during write”

Questo è il codice che ho utilizzato:

    private void fxtTrasmettiFattura(X509Certificate2 myCertificate)
    {
        try
        {
            BasicHttpBinding binding = new BasicHttpBinding();
            binding.SendTimeout = TimeSpan.FromMinutes(10);
            binding.OpenTimeout = TimeSpan.FromMinutes(1);
            binding.CloseTimeout = TimeSpan.FromMinutes(1);
            binding.ReceiveTimeout = TimeSpan.FromMinutes(10);

            binding.Security.Mode = BasicHttpSecurityMode.Transport;
            binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

            binding.MessageEncoding = WSMessageEncoding.Mtom;


            SdIRiceviFileClient sdIRiceviFile =
                new SdIRiceviFileClient(binding, new EndpointAddress("https://testservizi.fatturapa.it/ricevi_file"));

            sdIRiceviFile.ClientCredentials.ClientCertificate.Certificate = myCertificate;

            sdIRiceviFile.Open();
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                byte[] myFile = File.ReadAllBytes(openFileDialog1.FileName);

                fileSdIBase_Type fileSdI = new fileSdIBase_Type() { NomeFile = Path.GetFileName(openFileDialog1.FileName), File = myFile };
                rispostaSdIRiceviFile_Type rispostaSdI = sdIRiceviFile.RiceviFile(fileSdI);
                if (rispostaSdI.ErroreSpecified)
                {
                    string strError = null;
                    switch (rispostaSdI.Errore)
                    {
                        case erroreInvio_Type.EI01:
                            strError = "FILE VUOTO";
                            break;

                        case erroreInvio_Type.EI02:
                            strError = "SERVIZIO NON DISPONIBILE";
                            break;

                        case erroreInvio_Type.EI03:
                            strError = "UTENTE NON ABILITATO";
                            break;
                    }
                    MessageBox.Show(strError);
                }
                else
                    MessageBox.Show(string.Format(
                                    "Documento inviato\n" +
                                    "Data ricezione: {0}\n" +
                                    "Identificativo SdI: {1}\n" +
                                    "", rispostaSdI.DataOraRicezione, rispostaSdI.IdentificativoSdI));
            }

            sdIRiceviFile.Close();
        }
        catch (Exception ex)
        {
            string strError = ex.Message;
            if (ex.InnerException != null)
                strError += Environment.NewLine + ex.InnerException.Message;

            strError += Environment.NewLine + Environment.NewLine + ex.Source + Environment.NewLine + ex.StackTrace;

            MessageBox.Show(strError);
        }
    }

Grazie, anche se l’ho già fatto e funziona davvero !!
grazie!

Ma ora stai dando l’errore SdiRiceviFile.erroreInvio_Type.EI01 e ho già trovato nella documentazione che corrisponde all’errore “EI01 = FILE VUOTO”
Ma sto inviando il documento in base64 non capisco perché dà file vuoto.
Se potessi aiutare, grazie.

Io il file non lo ho messo in base64 ma invio direttamente l’array di byte (guarda nel codice “byte[] myFile = File.ReadAllBytes(openFileDialog1.FileName);” )

Spero ti possa aiutare
Cme sei messo con la ricezione?

Penso che stia rifiutando il file perché non è firmato.
Firmate i vostri documenti?
Non sto ancora lavorando alla reception.

Si la firma è obbligatoria

firmi con il file .pfx?

No devi firmare in cades (file .p7m) per fare dei test puoi usare l’applicazione dike o aruba sign

Ciao, scusate ma io continuo a ricevere EI01 da testservizi: è normale? Eppure il file è firmato correttamente e se lo carico attraverso https://sdi.fatturapa.gov.it/SdI2FatturaPAWeb/sicurezza/AccediAlServizioAction.do?pagina=invia_ricevi_fattura ottengo risultato corretto.
Ho usato tutti e tre i metodi di seguito che vedo hanno usato un po’ tutti, in C#
string pathXML = @“C:\nomefile.xml.p7m”;
byte[] f = File.ReadAllBytes(pathXML);
e poi:
string sFatturaFirmata = Convert.ToBase64String(f);
request.fileSdIAccoglienza.File = Convert.FromBase64String(sFatturaFirmata);

oppure
request.fileSdIAccoglienza.File = Convert.FromBase64String(Convert.ToBase64String(f, 0, f.Length));

oppure
request.fileSdIAccoglienza.File=f;

Ottengo sempre EI01, ovviamente ho impostato anche request.NomeFile=“nomefile.xml.p7m”;

Ciao.
Sono stato in grado di firmare il documento ma ora ho l’ERI EI01- file allegato vuoto

Ciao,
ma come fate a firmare il documento .xml ?

Firmo il documento con o file .pfx

X509Certificate2 certificate = new X509Certificate2(CertifiedPath, CertifiedPassword, X509KeyStorageFlags.MachineKeySet);

string inFile = pathlog+"/IT9999999"+ _idprogressivo + “.xml”;
string sigFile = pathlog + "/IT9999999" + _idprogressivo + “.xml.p7m”;
try
{
ContentInfo content = new ContentInfo(new System.Security.Cryptography.Oid(“1.2.840.113549.1.7.1”, “PKCS 7 Data”), File.ReadAllBytes(inFile));
SignedCms signedCms = new SignedCms(SubjectIdentifierType.IssuerAndSerialNumber, content, false);
CmsSigner signer = new CmsSigner(certificate);
signer.IncludeOption = X509IncludeOption.EndCertOnly;
signer.DigestAlgorithm = new System.Security.Cryptography.Oid(“2.16.840.1.101.3.4.2.1”, “SHA256”);
signer.SignedAttributes.Add(new Pkcs9SigningTime(DateTime.Now));
try
{
//PKCS7 format
signedCms.ComputeSignature(signer, false);
}
catch (System.Security.Cryptography.CryptographicException cex)
{
_stringsql = cex.ToString();
}
byte[] signature = signedCms.Encode();
File.WriteAllBytes(sigFile, signature);
}
catch (Exception ex)
{
_stringsql = ex.ToString();
}

Il mio errore EI01 si è verificato perché dovevo fare questo:

“Ciao ho appena parlato con agenzia entrate.
Mi dice che stiamo sbagliando i codici
Allora il signore mi ha detto che bisogna andare sul Sito delle fatture pa poi cliccare i tuoi strumenti poi usa gestione canale poi richiesta di accreditamento e inserisci dopo inserisci una password e vai a cliccare il tuo test interoperabilità dopo gestione test clicca il tuo codice destinatario e li ci tre trecici cici insieme con www. Per lui il problema è. Non sta usando il codice giusto”

Stavo inviando il campo del file xml con il valore sbagliato

OK, ce l’ho fatta; dopo aver risolto l’errore 401, ne ho ricevuto uno di tipo 405; con il trace di IIS sono riuscito a risolvere anche questo, era un modulo (DefaultDocumentModule) da configurare