8 messaggi dal 02 ottobre 2014
Altro problema:
Non riesco a fare apparire sulla request
SOAPAction ...

IL codice usato è il seguente già visto sul forum. In esecuzione passa dalla parte superiore dell'If ma
la SOAPAction nella testata non c'è! Verificato con fiddler.
Che ne pensate?


Public Function BeforeSendRequest(ByRef request As System.ServiceModel.Channels.Message, ByVal channel As System.ServiceModel.IClientChannel) As Object Implements System.ServiceModel.Dispatcher.IClientMessageInspector.BeforeSendRequest
' ottengo un riferimento alla richiesta http sottostante
Dim richiestaHttp As HttpRequestMessageProperty
richiestaHttp = CType(request.Properties.Values(1), HttpRequestMessageProperty)
If Not IsNothing(richiestaHttp) Then
richiestaHttp.Headers.Add("SOAPAction", """http://visualizzaerogato.wsdl.dem.sanita.finanze.it/VisualizzaErogato""")
richiestaHttp.Headers.Add("Authorization", msauthorization)
MsgBox("1-" & HttpRequestMessageProperty.Name)
Else
''non c'era? La creiamo noi.
richiestaHttp = New HttpRequestMessageProperty
richiestaHttp.Headers.Add("Authorization", msauthorization)
'request.Properties.Add(HttpRequestMessageProperty.Name, richiestaHttp)
richiestaHttp.Headers.Add("SOAPAction", """http://visualizzaerogato.wsdl.dem.sanita.finanze.it/VisualizzaErogato""")
MsgBox("2-" & HttpRequestMessageProperty.Name)
request.Properties.Add(HttpRequestMessageProperty.Name, richiestaHttp)
End If
BeforeSendRequest = request
End Function
8 messaggi dal 02 ottobre 2014
Mi rispondo da me ed ho risolto.
BasicHttpsBinding esiste solo sul Net Framework 4.5 e
l'intestazione SOAPAction nella request è accettata ed appare solo con quella release.
Sono passato a Visual Studio 2013 e funziona tutto.
Compreso l'Interop Toolkit
47 messaggi dal 27 ottobre 2014
Ciao a tutti,

mi sono appena iscritto e volevo ringraziare innanzitutto Moreno che ha dato luce ad un problema che sembrava irrisolvibile: sono anch'io vittima dell'inefficenza dei tecnici SOGEI che prima mi avevano probabilmente mandato fuoristrada indicandomi la strada sbagliata (Soapahttpclientprotocol tramite Web Service e non Service reference e durante l'ultima settimana non rispondendo più alle email ...

Grazie invece a questo forum, Ho ottenuto il collegamento utilizzando c# e Visual Studio 2012 ma mi sto nuovamente "infognando" nel tentativo di tradurre le classi in VB.NET.

potete aiutare anche me (ho i minuti contati) inviandomi le due classi

public class BasicAuthenticationInspector : IClientMessageInspector
{
...
}

public class BasicAuthenticationBehavior : IEndpointBehavior
{
...
}

tradotte in vb.net con tutti i riferimenti necessari al corretto funzionamento?

in particolare non riesco a tradurre:

var richiestaHttp = messaggio.Properties.Values.OfType<HttpRequestMessageProperty>().FirstOrDefault();

Inoltre non accetta la definizione:

Public Class BasicAuthenticationInspector
Implements IClientMessageInspector (questa riga da errore)
End Class

Scusate ma anche io provengo da VB6 e sono alle prime armi con VB.NET

Grazie

Enzo
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Enzo, prego :) haha non avevo idea che ci saremmo trovati qui in tanti. Magari segnala questa discussione ai tecnici della SOGEI così sapranno indirizzare i prossimi utenti.

Questo è l'esempio di client in VB.NET:
https://1drv.ms/u/s!Ao4rhSdtDw8riiL-shTOw4RMY2G5

Enzo58 ha scritto:

in particolare non riesco a tradurre:
var richiestaHttp = messaggio.Properties.Values.OfType<HttpRequestMessageProperty>().FirstOrDefault();

Quella è l'invocazione ad un metodo generico, puoi tradurla in VB.NET sostituendo le parentesi angolari con (Of type).
Dim richiestaHttp = messaggio.Properties.Values.OfType(Of HttpRequestMessageProperty)().FirstOrDefault()


Enzo58 ha scritto:

Inoltre non accetta la definizione:

Public Class BasicAuthenticationInspector
Implements IClientMessageInspector (questa riga da errore)
End Class

Forse mancava un Imports System.ServiceModel.Dispatcher. Fai attenzione ai suggerimenti di Visual Studio, di solito ti aiuta nell'inserire gli Imports necessari.

ciao,
Moreno
Modificato da BrightSoul il 07 luglio 2016 23.32 -

Enjoy learning and just keep making
47 messaggi dal 27 ottobre 2014
Ciao Moreno,

grazie per la veloce risposta e per il tuo prezioso aiuto.
In effetti il problema e' che per fare le cose in fretta ho provato ad utilizzare il tutto direttamente tramite Interop Toolkit 2.0 ... ed il problema e' proprio qui. Infatti con un progetto VB ex-novo funziona tutto perfettamente. In pratica con il progetto creato tramite Interop non mi riconosce proprio l'istruzione:

'Dim richiestaHttp = messaggio.Properties.Values.OfType(Of HttpRequestMessageProperty)().FirstOrDefault()

error BC30456: 'OfType' is not a member of 'System.Collections.Generic.ICollection(Of Object)'.
Build started 28/10/2014 10:51:52.

che ho dovuto sostituire con:

Dim richiestaHttp As New HttpRequestMessageProperty()

che nel progetto VB funziona lo stesso

mi sembra di capire che non sta utilizzando le classi giuste ... ma non so come proseguire. Spero che tu o vegaL che utilizza Interop Toolkit mi possiate dare una mano a sbloccare la situazione ....

Grazie
Enzo

PS: ma se ottengo un OCX in VB.NET non dovrei poterlo utilizzare lo stesso in ambiente VB6 ?
8 messaggi dal 02 ottobre 2014
Per Enzo,
in primo luogo InteropToolkit vuole il framework 2.0 ma, oltre ad esso, la parte vb.net è stat destinata al framework 4.5.
Io ho usato vb.net 13 con cui non funziona il plugin dell?interop Toolkit che consentirebbe di produrre automaticamente la classe wrapper; ma se guardi gli esempi, la classe wrapper la puoi fare da solo.
In secondo luogo ti posto i sorgenti delle due classi per come io le ho tradotte da C#, con in più una modifica per parametrizzare la SOAPAction.

(A titolo di informazione la prossima scadenza è in parte saltata e in parte allegerita)

Imports System.ServiceModel.Dispatcher
Imports System.Text
Imports System.ServiceModel.Channels

Public Class BasicAuthenticationInspector
    Implements IClientMessageInspector
    Private msauthorization As String
    Private msSOAPAction As String

    Public Sub New(ByVal UserName As String, ByVal Password As String, ByVal SOAPAction As String)
        msauthorization = "Basic " & Convert.ToBase64String(Encoding.UTF8.GetBytes(String.Format("{0}:{1}", UserName, Password)))
        msSOAPAction = SOAPAction
    End Sub

    Public Sub AfterReceiveReply(ByRef reply As System.ServiceModel.Channels.Message, ByVal correlationState As Object) Implements System.ServiceModel.Dispatcher.IClientMessageInspector.AfterReceiveReply
        Exit Sub
    End Sub

    Public Function BeforeSendRequest(ByRef request As System.ServiceModel.Channels.Message, ByVal channel As System.ServiceModel.IClientChannel) As Object Implements System.ServiceModel.Dispatcher.IClientMessageInspector.BeforeSendRequest
        '  ottengo un riferimento alla richiesta http sottostante
        Dim richiestaHttp As HttpRequestMessageProperty
        richiestaHttp = CType(request.Properties.Values(1), HttpRequestMessageProperty)
        If Not IsNothing(richiestaHttp) Then
            ' richiestaHttp.Headers.Add("SOAPAction", msSOAPAction)
           richiestaHttp.Headers.Add("Authorization", msauthorization)

        Else
            ''non c'era? La creiamo noi.
            richiestaHttp = New HttpRequestMessageProperty
            richiestaHttp.Headers.Add("Authorization", msauthorization)
            'request.Properties.Add(HttpRequestMessageProperty.Name, richiestaHttp)
            ' richiestaHttp.Headers.Add("SOAPAction", msSOAPAction)
            request.Properties.Add(HttpRequestMessageProperty.Name, richiestaHttp)
        End If
        BeforeSendRequest = request
    End Function
End Class



Imports System.ServiceModel
Imports System.Text
Imports System.ServiceModel.Description

Public Class BasicAuthenticationBehavior
    Implements IEndpointBehavior
    Private msUserName As String
    Private msPassword As String
    Private msSOAPAction As String
    Public Sub ApplyClientBehavior(ByVal endpoint As ServiceEndpoint, ByVal clientRuntime As Dispatcher.ClientRuntime) Implements IEndpointBehavior.ApplyClientBehavior
        ' aggiungo un'istanza dell'inspector
        clientRuntime.MessageInspectors.Add(New BasicAuthenticationInspector(msUserName, msPassword, msSOAPAction))
    End Sub
    Public Sub New(ByVal UserName As String, ByVal Password As String, ByVal SOAPAction As String)
        ' raccolgo user e password che passerò poi al costruttore di IClientMessageInspector
        msUserName = UserName
        msPassword = Password
        msSOAPAction = SOAPAction
    End Sub

    Public Sub AddBindingParameters(ByVal endpoint As ServiceEndpoint, ByVal bindingParameters As System.ServiceModel.Channels.BindingParameterCollection) Implements IEndpointBehavior.AddBindingParameters
        Exit Sub
    End Sub

    Public Sub ApplyDispatchBehavior(ByVal endpoint As ServiceEndpoint, ByVal endpointDispatcher As Dispatcher.EndpointDispatcher) Implements IEndpointBehavior.ApplyDispatchBehavior
        Exit Sub
    End Sub
    Public Sub Validate(ByVal endpoint As ServiceEndpoint) Implements IEndpointBehavior.Validate
        Exit Sub
    End Sub
End Class
47 messaggi dal 27 ottobre 2014
Ciao vegaL,

grazie per la tua collaborazione (temevo che avendo risolto i problemi avessi abbandonato o trascurato il forum).

Allora, premetto che in un programma Vb.Net stand-alone, funziona tutto, sia utilizzando ServiceReference che WebReference; anzi utillizzando quest'ultimo e' anche più semplice in quanto basta inserire solo l'override al metodo GetWebRequest (come effettivamente suggerito dai tecnici SOGEI).

Per utilizzare l'ActiveX in VB6 ho proceduto così:

Ho creato il progetto in VS2010, dove e' ancora gestito il modello VB6 Interop Usercontrol, l'ho importato in VS2012, ho completato il progetto e .... funziona tutto ma il collegamento non avviene correttamente. La cosa che non quandra, e' che mi da errore sia se utilizzo il tuo esempio:


Dim richiestaHttp As HttpRequestMessageProperty
richiestaHttp = CType(request.Properties.Values(1), HttpRequestMessageProperty)

che quella di Moreno:
Dim richiestaHttp = messaggio.Properties.Values.OfType(Of HttpRequestMessageProperty)().FirstOrDefault()

(nel progetto VB Stand-Alone funzionano entrambe)

che ho dovuto sostituire con

Dim richiestaHttp As New HttpRequestMessageProperty()
richiestaHttp = New HttpRequestMessageProperty()

(che funziona anche nello Stand-Alone)

Mi sembra di capire che per HttpRequestMessageProperty non utilizza la classe giusta (infatti non gli risulta Values come vettore, ecc.)

Ad ogni modo sto gia' proseguendo per strade alternative, ma se mi potessi inviare il progetto di base da utilizzare con Interop Toolkit mi faresti un grandissimo favore.

Grazie ancora.
Enzo
8 messaggi dal 02 ottobre 2014
Ti ripeto che potrebbe essere un problema di target dell'applicazione rispetto ad una determinata versione del framework.
Avevo problemi analoghi (metodi e proprietà diverse negli oggetti) ed ho risolto solo quando ho messo come target del progetto il framework 4.5.1

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.