Buongiorno a tutti,
ho un'applicazione asp.net risiedente su un server in internet che utlizza alcune funzioni per inserire dati in un db (sql server).
Vorrei potere usare le stesse funzioni dell'applicazione per inserire i dati senza usare i WebForm dell'applicazione stessa, ma da dei programmi windows creati appositamente.

Non ho nessuna competenza in merito, ma ho visto che potrebbero fare al caso mio sia i web services che il remoting, da richiamare dall'applicazione winform...

Cosa mi consigliate?
Nel caso dei web services è possibile condividere delle classi tra l'applicazione e il web service stesso, o devono essere separati completamente?

Grazie!
VueMme

Grazie, ciao,
VueMme
Semplificando, la differenza nell'uso dei servizi Web ripetto ai servizi remoti sta in generale in due aspetti fondamentali:

- tipizzazione e marshaling;
- comunicazione e protocolli.

Infatti i Web Services sono stati concepiti con il principale obiettivo della interoperabilità. Per questo motivo sono state introdotte una serie di limitazioni relative al marshaling ed alla tipizzazione per garantire la possibilità di comunicazione anche con sistemi non necessariamente basati su tecnologia .NET. L'approccio usato nei servizi remoti è diverso in quanto l'ambiente è omogeneo (.NET), basato sulle stesse classi della BCL sia sul client che sul server, con meno problemi inerenti la tipizzazione e il marshaling. L'altro discorso riguarda i canali di comunicazione: TCP e HTTP nei servizi remoti (Binary o SOAP) contro solo HTTP per i servizi Web.

A mio avviso, i servizi remoti andrebbero evitati in un contesto d'uso extra Intranet.

Il consiglio che ti posso dare è di effettuare una scelta consapevole valutando i seguenti aspetti:

- contesto applicativo e sistemistico (LAN, Internet, ecc...);
- tipologia dei dati scambiati;
- numerosità dei dati scambiati;
- necessità di utilizzo di tipi "particolari";
- prestazioni (richieste per secondo e carico utenti).

Considera che in generale i Web services si comportano mediamente bene, unico neo il calo prestazionale nel caso in cui si usi SSL. Dall'altra parte i servizi remoti danno il massimo delle prestazioni in termini di richieste al secondo e carico utenti nella accoppiata TCP/Binary.

I contesti applicativi tra client e server sia per i servizi remoti che per i servizi Web sono e devono essere separati (stiamo parlando di applicazioni distribuite). Peraltro per quanto riguarda i Web services esiste la classe proxy sul client che permette la comunicazione e la condivisione dei tipi tra i due ambienti.

Ciao, Ricky.

Ing. Riccardo Golia
Microsoft MVP ASP.NET/IIS
ASPItalia.com Content Manager
http://blogs.aspitalia.com/rickyvr
http://ricky.aspitalia.com
http://www.riccardogolia.it
Grazie per la risposta!
Provo a spiegare meglio ciò che voglio fare:
ho un sito che gestisce una serie di documenti tramite interfaccia web (un gestore documentale). Agli utenti (che accedono con autenticazione basata su form) sono assegnati vari privilegi, tra cui quello che permette loro di effettuare l'upload di documenti.
Questo è realizzazto con una pagina upload.aspx che richiama le funzioni di una classe che si chiama "Upload", così che l'utente passa alla pagina il file da uploadare e poi la classe fa il resto, ossia salva il file nel file system del server e compila il db con i vari campi necessari.

La mia necessità sorge nel momento in cui vorrei creare dei programmi winform (dei connector per word, excel,...) da cui uploadare direttamente il file senza passare per la pagina upload.aspx (in questo modo l'utente non dovrebbe riscrivere alcuni dati già presenti in word).

In pratica vorrei da word premere un pulsante "pubblica" che uploada direttamente nel gestore documentale il file, senza per forza dovere fare il login sul sito.

La mia idea era quindi quella di passare ad un web control lo user, la pwd, il file (come stream) e i campi da scrivere nel db (preparati e formattati dal prog winform).
Dovrebbe poi essere il web control ad autenticare l'utente con le credenziali passate e a richiamare la classe Upload dell'applicazione principale per usare le stesse funzioni che vengono richiamate dalla pagina upload.aspx

Si può fare?

Grazie e scusate se sono stato prolisso...
VueMme

Grazie, ciao,
VueMme
Un Web service può effettivamente fare al caso tuo...

Ciao, Ricky.

Ing. Riccardo Golia
Microsoft MVP ASP.NET/IIS
ASPItalia.com Content Manager
http://blogs.aspitalia.com/rickyvr
http://ricky.aspitalia.com
http://www.riccardogolia.it
Mi puoi indicare dove reperire un po' di info in merito?
Ho trovato moltissimi articoli sui web service, ma nulla sulla possibilità di condividere classi con un'applicazione webform.

Grazie, ciao,
VueMme

Grazie, ciao,
VueMme
Ti basta definire un tipo nell'ambito del Web Service... All'atto della sua creazione, la classe proxy legge la definizione del documento WSDL e crea una classe equivalente nell'ambito dell'applicazione client.

Prova con un progettino di test e vedi...

Ciao, Ricky.

Ing. Riccardo Golia
Microsoft MVP ASP.NET/IIS
ASPItalia.com Content Manager
http://blogs.aspitalia.com/rickyvr
http://ricky.aspitalia.com
http://www.riccardogolia.it
Grazie delle info, ora provo...

Grazie, ciao,
VueMme
Ha fatto una semplice prova, ma non ho capito bene, scusa se sono un po' duro...
Non capisco cosa vuole dire definire un tipo nell'ambito del Web Service.
Ho visto che, quando con Visual Studio aggiungo il riferimento web al web service (non ho usato WSDL) nella mia applicazione, viene creata una classe con all'interno tutti i WebMethod che ho definito nel web service.
Io però vorrei usare dentro la mia applicazione anche delle funzioni che ho definito in una classe interna al web service, l'unico modo è creare tanti WebMethod quante sono le funzioni che voglio usare?

Ecco come ho creato il web service e l'applicazione di prova:

Ho creato un web service (http://localhost/xTestWebService_WebService/xWebService.asmx) così fatto:

'******* INIZIO CODICE *******
Imports System
Imports System.DateTime
Imports System.Xml
Imports System.Web.Services
Imports System.Web.Security
Imports System.Web.Services.Protocols

<System.Web.Services.WebService(Namespace:="http://tempuri.org/xTestWebService_WebService/Service1")> _
Public Class xWebServiceClass
Inherits System.Web.Services.WebService

<WebMethod()> _
Public Function Authenticate(ByVal User As String, ByVal Password As String) As Boolean
If (User = "Administrator" AndAlso Password = "password") Then
FormsAuthentication.SetAuthCookie(User, True)
Return True
Else
Return False
End If
End Function

Private Function isAuthenticate()
If User.Identity.IsAuthenticated Then
Return True
Else
Throw New SoapException("Accesso non consentito", _
New XmlQualifiedName("SoapHeader"))
Return False
End If
End Function

<WebMethod()> _
Public Function OraAttuale() As String
If Not isAuthenticate() Then Exit Function

Dim f = New Funzioni
Return f.Ora
End Function
End Class
'******* FINE CODICE *******

con la classe Funzioni così fatta:
'******* INIZIO CODICE *******
Public Class Funzioni
Function Ora()
Return Now.ToString
End Function

Function TestStringa()
Return "Stringa di prova"
End Function
End Class
'******* FINE CODICE *******

Poi ho creato un'applicazione asp.net (http://localhost/xTestWebService) e le ho aggiunto il riferimento web (con VS) a http://localhost/xTestWebService_WebService/xWebService.asmx

Nel file WebForm1.aspx ho messo:

'******* INIZIO CODICE *******
Imports System.Net
Imports System.Web.Services.Protocols
Imports xTestWebService.localhost 'Riferimento al webservice

Public Class WebForm1
Inherits System.Web.UI.Page

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Try
Dim objOra As New xWebService
Dim objCookieContainer As New CookieContainer
objOra.CookieContainer = objCookieContainer
objOra.Authenticate("Administrator", "password")
Label1.Text = objOra.OraAttuale()
Catch err As SoapException
Label1.Text = err.Message
End Try

End Sub
End Class
'******* FINE CODICE *******

Se volessi usare dall'applicazione la funzione TestStringa() presente nella classe 'Funzioni' del web service l'unico modo è crearne un <WebMethod()> che la richiami dentro xWebService.asmx?

Grazie ancora!

Grazie, ciao,
VueMme

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.