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.
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.
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?
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.
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