Notifica Scarto

Buongiorno a tutti,
sono riuscito a gestire in modo corretto la parte di autenticazione su IIS, andando però a schiantarmi sulla lettura della risposta fornita dal SdI.
Quello che succede è che riesco ad inviare correttamente le fatture e (a quanto pare) ricevo il messaggio di risposta, in questo caso un messaggio di NotificaScarto, senza però riuscire a catturare l’oggetto.
Credo che sia un problema legato ai Namespace, ma non riesco proprio a capire dove sto sbagliando; le classi sono state generate a partire dagli XSD forniti da SdI.

Per fare i test sto utilizzando SoapUI, verificando che la chiamata che fa il SdI e quella che si aspetterebbe il mio WS sono diverse.

Chiamata SOAP fatta da SdI:

<soapenv:Envelope xmlns:soapenv=“http://schemas.xmlsoap.org/soap/envelope/”>
< soapenv:Header>
< WSCorIDSOAPHeader xmlns=“http://www.wilytech.com/” CorID=“”>
</soapenv:Header>
< soapenv:Body>
<ns2:notificaScarto xmlns:ns2=“http://www.fatturapa.gov.it/sdi/ws/trasmissione/v1.0/types”>
< IdentificativoSdI>< /IdentificativoSdI>
< NomeFile>< /NomeFile>
< File>< /File>
</ns2:notificaScarto>
</soapenv:Body>
</soapenv:Envelope>

Questa invece la chiamata che si aspetta il mio WS

<soapenv:Envelope xmlns:soapenv=“http://schemas.xmlsoap.org/soap/envelope/” xmlns:typ=“http://www.fatturapa.gov.it/sdi/ws/trasmissione/v1.0/types” xmlns:ns=“http://schemas.datacontract.org/2004/07/”>
< soapenv:Header/>
< soapenv:Body>
< typ:NotificaScarto>
< typ:IdentificativoSdI></typ:IdentificativoSdI>
< typ:NomeFile></typ:NomeFile>
< typ:File></typ:File>
</typ:NotificaScarto>
</soapenv:Body>
</soapenv:Envelope>

La chiamata va a buon fine, perché non mi ritorna alcuna eccezione, solamente che i parametri sono tutti nulli.

Avete qualche suggerimento o idea su dove stia sbagliando?

Grazie a tutti

Ciao,
stai sviluppando un WCF?
Anch’io ho avuto lo stesso problema, ed ho dovuto produrre una correzione al flusso in ingresso.
Tu come hai risolto?

Mi accodo, forse ho un problema analogo e non riesco a risolvere.
Premetto che sviluppiamo in .net codice vb, abbiamo creato il ws trasmissionefatture.asmx a partire da wsdl fornito da sdi, riusciamo ad inviare le fatture e abbiamo passato tutti i test di interoperabilità.
Il nostro web service trasmissionefatture non fa ancora nulla, ci sono i metodi vuoti e adesso stiamo sviluppando il codice per gestire le notifiche. Il problema è che il codice non viene eseguito!!! La chiamata da sdi non rende errori e lo conferma che i test sono superati ma il ws non fa niente. Abbiamo provato a loggare su file o su db e niente.
Lo stesso chiamando da soapui (anche ws in sviluppo su locahost) non fa niente, risposta 200 ok, ma non esegue niente.
Funziona solo se facciamo chiamata direttamente da browser in debug.

Grazie a tutti per qualunque suggerimento

Ciao,
il mio problema è stato definire il mapping dell’oggetto NotificaEsito e il flusso che arriva da Sdi.
Nello specifico non sono riuscito a trattare la parte di Namespace
<ns2:notificaScarto xmlns:ns2="“http://www.fatturapa.gov.it/sdi/ws/trasmissione/v1.0/types”">
Dopo aver perso un paio di giorni, ho deciso di bypassare modificando il flusso di ingresso togliendo gli ns2.
Io ho sviluppato in C#, ma non cambia rispetto a VB. Se è questo il tuo problema ti passo il codice.

Ciao, non saprei ma si potrebbe essere, il server risponde perché vedo la chiamata nel trace ma è come se non eseguisse il codice nel metodo NotificaScarto (o uno degli altri metodi e lo stesso).
Si se mi passi il codice controllo, molte grazie

Ciao,
questa la definizione del service
[ConsoleServiceBehavior]
[ServiceBehavior(Name = “iTrasmetti”)]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[XmlSerializerFormat()]
public class Trasmetti : ITrasmetti

la classe (utilizza un convertitore c# to vb.net) per intercettare la chiamata prima che arrivi al metodo:
public class ConsoleServiceBehavior : Attribute, IServiceBehavior
{
public void AddBindingParameters(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection endpoints, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
{
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase)
{
foreach (var item in serviceHostBase.Description.Endpoints)
{
item.Behaviors.Add(new ConsoleEndpointBehavior());
}
}
public void Validate(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase)
{
}
}
public class ConsoleMessageInspector : IClientMessageInspector, IDispatchMessageInspector
{
public Message CreateMessage(Message message)
{
MessageBuffer buffer = message.CreateBufferedCopy(Int32.MaxValue);
Message msg = buffer.CreateMessage();
StringBuilder sb = new StringBuilder();
using (System.Xml.XmlWriter xw = System.Xml.XmlWriter.Create(sb))
{
msg.WriteMessage(xw);
xw.Close();
}
return buffer.CreateMessage();
}
private Message TransformMessage(Message oldMessage)
{
try
{
MemoryStream ms = new MemoryStream();
XmlWriter xw = XmlWriter.Create(ms);
oldMessage.WriteMessage(xw);
xw.Flush();
string body = Encoding.UTF8.GetString(ms.ToArray());
body = body.Replace("<ns2:", “<”);
body = body.Replace("</ns2:", “</”);
body = body.Replace(“xmlns:ns2=”, “xmlns=”);
xw.Close();
ms = new MemoryStream(Encoding.UTF8.GetBytes(body));
XmlDictionaryReader xdr = XmlDictionaryReader.CreateTextReader(ms, new XmlDictionaryReaderQuotas());
Message newMessage = Message.CreateMessage(xdr, int.MaxValue, oldMessage.Version);
newMessage.Properties.CopyProperties(oldMessage.Properties);
return newMessage;
}
catch
{
return oldMessage;
}
}
public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext)
{
request = TransformMessage(request);
return request;
}
public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
{
reply = CreateMessage(reply);
}
public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
{
reply = CreateMessage(reply);
}

    public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel)
    {
        request = CreateMessage(request);
        return null;
    }
}

public class ConsoleEndpointBehavior : IEndpointBehavior
{
    public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
    {
    }
    public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime)
    {
        clientRuntime.MessageInspectors.Add(new ConsoleMessageInspector());
    }
    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher)
    {
        endpointDispatcher.DispatchRuntime.MessageInspectors.Add(new ConsoleMessageInspector());
    }
    public void Validate(ServiceEndpoint endpoint)
    {
    }
}

Non è pulito come metodo, ma in assenza di altro….

Ciao Antonio, grazie per il codice.
Stiamo usando però un web service asmx non wfc.
In ogni caso abbiamo fatto dei passi avanti, inserendo nell’evento Application_BeginRequest del global.asax riusciamo a catturare la request.inputstream che contiene la soapenv:Envelope inviata con la notifica e dentro ci sono i dati che servono.
Abbiamo visto che il nostro metodo NotificaScarto viene correttamente chiamato però il parametro in ingresso “scarto” (di tipo fileSdI_Type) è Nothing. Qualche suggerimento?
Si potrebbe gestire tutto nella Application_BeginRequest ma non è molto pulito.

Buonasera…Ciao,
Anche io sto sviluppando in VB .NET, ho il problema dell’ errore (org.apache.axis2.AxisFault: HTTP ( 500 ) Internal Server Error address : https://26.2.162.231:80) nel momento in cui devo ricevere la notifica di scarto…mi sembra di capire che il problema sia il fatto che il mio WS Trasimissione Fatture
non tratta i messaggi in formato Mtom. come faccio a dire al mio WEbService di accettare i messaggi MTOM inVB .NET?

Che versione .net?
Il web service è wcf o asmx?
Prova con soapui riesci ad ottenere più informazioni per capire il problema

  • visual studio 2017
  • .net framework di dest. 4.6.1
  • il ws è .asmx

Scusate a me quando invoco il mio servizio con un allegato notifica scarto che mi manda SDI mi risponde con

SOAP-ENV:Server
Procedure ‘NotificaScarto’ not present

Mentre se mando un allegato modificato da me risponde l’unica differenza è il ns. Su quella di sdi è ns3:NotificaScarto mentre su quella modificata è ns2:notificaScarto. Ho fatto anche diverse prove maiuscole/minuscole ma niente.

Capitato a qualcuno?

se non erro i vecchi asmx non accettano mtom, devi sviluppare in wcf e nel web.config aggiungere messageEncoding=“Mtom” al binding

Ciao, funziona anche con asmx.
ho sviluppato un servizio .asmx e riesco a fare tutto, passati tutti i test e ho il canale in produzione

Ottimo bene, anch’io passati i test e metterò in prod a breve

Occhio che se passi in produzione, non puoi più fare i test dell’applicativo che devi o che stai sviluppando.

si infatti, “a breve” = abbiamo ancora una tonnellata di verifiche su gestione logs/salvataggio files/etc …
Thx

ahahahahahahah

IDEM!

Ciao,
ho avuto la pausa estiva e riprendo ora.
Qualcuno sa come gestire
Invio Notifica Decorrenza Termini a Pubblica Amministrazione
?
Grazie mille

1 Mi Piace

buonasera Daniele,

Sei percaso incappato in questo problema durante i test di “Ricezione Fatture”?:

Server did not recognize the value of HTTP Header SOAPAction: http://www.fatturapa.it/RicezioneFatture/RiceviFattureSdI.

il mio Ws è in .NET asmx

Ciao @FunkySteve
mi sembra di vedere che stai chiamando un http e non un https
I loro ws (ed anche i tuoi in ricezione) sono https, devi impostarlo nel binding (vuoi farlo nel web.config), ed aver installato correttamente i certificati sia client che server