Ciao,
Però non riesco a capire come generare il client lato ASP.NET che richieda i servizi all'host e non utilizzi direttamente quelli della libreria WCF.
Devi compilare e avviare il progetto console, in modo che il servizio e il suo WSDL siano raggiungibili via HTTP.
Poi lanci svcutil passandogli l'indirizzo del WSDL e ti genererà le classi proxy.
Comunque... ripercorriamo tutti i passi da capo.
1. Creo la libreria WCF e il progetto console.
2. Dal progetto console referenzio la libreria WCF e scrivo questo codice nel metodo Main del progetto console (
tratto dalla documentazione) per ospitare il servizio. Nota come vengano esposti due endpoint: uno
BasicHttpBinding per il servizio vero e proprio e uno
MexHttpBinding per esporre il WSDL.
Nota anche che lo sto mettendo in ascolto sulla porta 8001 di localhost.
ServiceHost svcHost = new ServiceHost(typeof(Service1), new Uri("http://localhost:8001/"));
ServiceMetadataBehavior smb = svcHost.Description.Behaviors.Find<ServiceMetadataBehavior>();
if (smb == null)
{
smb = new ServiceMetadataBehavior();
}
smb.HttpGetEnabled = true;
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
svcHost.Description.Behaviors.Add(smb);
svcHost.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpBinding(), "mex");
svcHost.AddServiceEndpoint(typeof(IService1), new BasicHttpBinding(), "");
svcHost.Open();
// The service can now be accessed.
Console.WriteLine("The service is ready.");
Console.WriteLine("Press <ENTER> to terminate service.");
Console.WriteLine();
Console.ReadLine();
// Close the ServiceHostBase to shutdown the service.
svcHost.Close();
In questo esempio,
Service1 e
IService1 sono rispettivamente l'implementazione concreta e l'interfaccia del mio servizio WCF. Nel tuo caso avranno altri nomi, presumo.
3. Adesso compilo e avvio il progetto console (se non riesce ad aprire la porta, avvialo come amministratore).
In output vedo questo, che mi dà conferma che il servizio è in ascolto.
The service is ready.
Press <ENTER> to terminate service.
Se voglio ulteriore conferma, vado nel browser e digito l'indirizzo che nel mio caso era:
Riesco correttamente a vedere la pagina informativa del servizio che, tra l'altro, mi dice che il WSDL è ospitato a questo indirizzo:
http://localhost:8001/?wsdl
4. Quindi vado ad aprire il prompt dei comandi per sviluppatori di Visual Studio e digito:
svcutil http://localhost:8001/?wsdl /Language=c# /t:Code /out:ClassNameProxy.cs /config:ClassNameProxy.config
5. Nella directory corrente vengono generati i file
ClassNameProxy.cs e
ClassNameProxy.config.
Il file
ClassNameProxy.cs lo sposto nell'applicazione ASP.NET Core, mentre il file .config lo posso pure eliminare. Il file config non mi serve perché posso configurare il client da codice C#.
6. Quindi nell'applicazione ASP.NET Core installo questo pacchetto Nuget. Da riga di comando, nella directory del progetto ASP.NET Core, scrivo:
dotnet add package System.ServiceModel.Http
7. Compilo l'applicazione ASP.NET Core e non dovrebbero esserci errori. Ora è il momento di istanziare il client e inviare la prima richiesta. Da qualche parte scrivo quanto segue, ad esempio nell'action di un controller di ASP.NET Core.
Nota come io stia usando la stessa configurazione del server (BasicHttpBinding e porta 8001 di localhost).
var binding = new BasicHttpBinding();
var address = new EndpointAddress("http://localhost:8001");
var client = new Service1Client(binding, address);
var data = await client.GetDataAsync(1);
In questo esempio il mio client si chiama
Service1Client mentre nel tuo caso si potrebbe chiamare in altro modo. E' una classe definita dentro
ClassNameProxy.cs. Cerca "Client" e la troverai.
Qui ho anche invocato l'operazione GetDataAsync(1). Nel tuo caso avrai altre operazioni. Usa l'intellisense per capire che chiamate puoi fare.
ciao,
Moreno
Modificato da BrightSoul il 03 settembre 2019 20:33 -