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) in Program.cs:riga 44

Qualcuno ha suggerimento in merito?
Da browser richiamando il web service testfattura l'autenticazione ha esito positivo.

Grazie anticipatamente per le risposte

Alessio Arrigoni - CONSULENTE INFORMATICO
https://www.alessioarrigoni.it
https://www.assistenzapccomo.it
1 messaggio dal 18 dicembre 2018
Buon pomeriggio
Ho lo stesso problema, l'hai risolto?
Purtroppo no.
Leggendo sul forum forum.italia.it il problema a quanto pare sta nel XML della chiamata SOAP.
Ho inviato un ticket a SOGEI richiedendo se il problema può essere dovuto alla sintassi del XML nella chiamata SOAP, ma tutto tace o rispondono come una domanda che gira attorno al problema.
Per il momento ho preso spunto da questo articolo http://www.winfxitalia.com/articoli/netcore/fattura-elettronica-dotnet.aspx, sto portando avanti la soluzione PEC e gestire quello che avrebbe dovuto fare il ws tramite PEC.

Alessio Arrigoni - CONSULENTE INFORMATICO
https://www.alessioarrigoni.it
https://www.assistenzapccomo.it
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Alessio,
purtroppo non avrai risposte significative dall'assistenza di Sogei. Ci sono passato anch'io... ma non con la fatturazione elettronica purtroppo, altrimenti avrei condiviso il sorgente.
L'unica cosa che puoi fare è richiedergli un esempio di richiesta SOAP funzionante, e poi provare a riprodurrla con il tuo client. Io avevo provato a riprodurla con WCF ma non sono stato in grado di controllare ogni aspetto. Per questo ho trattato la richiesta come documento XML, in modo da avere il pieno controllo su elementi e attributi, e poi l'ho inviata con HttpClient.

Se riesci a farlo con WCF (o in qualsiasi altro modo), per favore condividi il codice (o crea un repo su GitHub) perché sarà di estrema utilità per molti sviluppatori italiani.

ciao,
Moreno

Enjoy learning and just keep making
Ciao Moreno,
mi stai dicendo che il modo convenzionale di procedere adottando le classi generate dal WSDL fornito dall'agenzia delle entrate non può funzionare, ma l'XML della chiamata SOAP va costruito come fatto ad esempio per generare il file fattura.
Poi l'XML generato della chiamata SOAP lo invii con la classe httpclient?
Corretto?

Alessio Arrigoni - CONSULENTE INFORMATICO
https://www.alessioarrigoni.it
https://www.assistenzapccomo.it
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Alessio,

mi stai dicendo che il modo convenzionale di procedere adottando le classi generate dal WSDL fornito dall'agenzia delle entrate non può funzionare

No, non è che non può funzionare. E' che trovare la giusta configurazione di WCF richiede parecchio tempo. Io a un certo punto mi sono arreso perché non potevo dare al cliente tempi certi. E il fatto che il servizio di Sogei rispondesse sempre con un generico errore "500" non era di alcun aiuto.
Tu comunque un tentantivo con WCF fallo. Probabilmente una persona molto esperta sia di WCF che di WS-Security riuscirebbe a venirne a capo. Però, se vedi che la cosa si protrae a lungo, non scartare l'ipotesi di creare la richiesta SOAP a mano.


Poi l'XML generato della chiamata SOAP lo invii con la classe httpclient?

Esatto.

ciao,
Moreno
Modificato da BrightSoul il 20 dicembre 2018 11.57 -

Enjoy learning and just keep making
Ciao Moreno riesci a postare un esempio di come effettui l'invio?
Grazie

Alessio Arrigoni - CONSULENTE INFORMATICO
https://www.alessioarrigoni.it
https://www.assistenzapccomo.it
11.886 messaggi dal 09 febbraio 2002
Contributi
Ecco un esempio:
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
var handler = new HttpClientHandler();
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
handler.ClientCertificates.Add(new X509Certificate2(@"C:\percorso\certificato.pfx", "password"));

using (var client = new HttpClient(handler))
{
    var richiesta = "Qui contenuto della richiesta SOAP";
    var message = new HttpRequestMessage(HttpMethod.Post, "https://dominio/percorso");
    message.Content = new StringContent(richiesta);
    message.Content.Headers.ContentType.MediaType = "application/soap+xml";
    message.Content.Headers.ContentType.CharSet = "utf-8";
    
    var response = await client.SendAsync(message);
    //A scopo di debug stampo la risposta del server
    Console.WriteLine("HTTP/" + response.Version + " " + (int)response.StatusCode + " " + response.ReasonPhrase);
    //E le sua intestazioni
    foreach (var resp in response.Headers)
    {
        Console.WriteLine(resp.Key + ": " + resp.Value.First());
    }
    var corpoRisposta = await response.Content.ReadAsStringAsync();
   //TODO: fai qualcosa con il corpo della risposta
}


ciao,
Moreno

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.