ASP.NET 5 aggiunge riferimento al servizio WCF

In Visual Studio 2015 Preview (Pre Release), come posso aggiungere un riferimento al servizio per un servizio WCF ?

Attualmente, questo è un processo abbastanza coinvolto in quanto gli strumenti non sembrano supportare molto nel modo di generare codice client WCF o mappare automaticamente dai file di configurazione. Inoltre, come indicato da dotnetstep, il team di ASP.NET non ha ancora portato System.ServiceModel a 5 (o fornito ancora un’alternativa per i client WCF). Tuttavia, possiamo utilizzare un approccio basato su codice per creare un proxy client e utilizzare svcutil per generare le nostre classi di riferimento del servizio.

Soluzione Prerequisiti

Per questo esempio, assumerò che tu stia localmente ospitando un servizio all’indirizzo http: // localhost: 5000 / MapService.svc che implementa un contratto IMapService . Inoltre, chiameremo il progetto che conterrà il proxy di servizio MapClient .

Il tuo project.json dovrebbe assomigliare a qualcosa:

 { "commands": { "run": "run" }, "frameworks": { "dnx451": { "dependencies": { "Microsoft.AspNet.Mvc": "6.0.0-beta2" }, "frameworkAssemblies": { "System.ServiceModel": "4.0.0.0" } } } } 

Generare le classi di riferimento del servizio

Per prima cosa, creiamo una cartella, Service References , nel progetto MapClient .

Quindi, aprire Prompt dei comandi dello sviluppatore per VS2015 e accedere alla MapClient progetto MapClient :

 cd "C:\Users\youraccount\Documents\Visual Studio 2015\Projects\MapClient\src\MapClient" 

Assicurarsi che MapService sia in esecuzione ed eseguire il seguente comando:

 svcutil /language:cs /out:"Service References\MapServiceReference.cs" http://localhost:5000/MapService.svc 

Questo dovrebbe generare due file, output.config e MapServiceReference.cs .

Creare un proxy client basato su codice

Poiché non esiste un modo per mappare automaticamente endpoint e configurazione di binding da un file di configurazione al ClientBase attualmente in ASP.NET 5, output.config non è di grande utilità per noi. Puoi rimuoverlo.

Invece, creiamo un proxy client nel codice:

 using System.ServiceModel; namespace TestWCFReference { public class Program { public void Main(string[] args) { var endpointUrl = "http://localhost:5000/MapService.svc"; BasicHttpBinding binding = new BasicHttpBinding(); EndpointAddress endpoint = new EndpointAddress(endpointUrl); ChannelFactory channelFactory = new ChannelFactory(binding, endpoint); IMapService clientProxy = channelFactory.CreateChannel(); var map = clientProxy.GetMap(); channelFactory.Close(); } } } 

Ora è ansible utilizzare l’istanza clientProxy per accedere a qualsiasi contratto operativo in IMapService .

Come sidenote, sarebbe probabilmente l’architettura migliore per creare una chiave: file di configurazione del valore che memorizza la configurazione del binding e dell’endpoint e utilizzare l’object Microsoft.Framework.ConfigurationModel.Configuration per popolare il tuo ChannelFactory modo da poter mantenere la configurazione del servizio fuori dal tuo codice, ma speriamo che questo esempio possa iniziare.

È disponibile una nuova estensione di Visual Studio che consente di aggiungere e utilizzare riferimenti di servizio come nelle versioni precedenti. È anche compatibile con il nuovo CoreCLR, l’ho appena testato.

http://blogs.msdn.com/b/webdev/archive/2015/12/15/wcf-connected-service-visual-studio-extension-preview-for-asp-net-5-projects.aspx

Attualmente non ci sono strumenti disponibili per questo e il ansible motivo per questo System.ServiceModel che non è disponibile in asp.netcore5.

Se hai deciso di utilizzare ASP.net 5, puoi fare la seguente cosa fin da ora per utilizzare il servizio WCF (sto utilizzando Visual Studio 2015 CTP 5 per questa risposta)

In VS 2015 CTP 5, ci consente di aggiungere riferimenti alla normale libreria di classi.

  1. Crea servizio WCF.
  2. Crea una libreria di classi regolari (io scelgo .NET Framework 4.6)
  3. Successivamente ho aggiunto il riferimento al servizio WCF a ClassLibrary.
  4. Aggiungi ClassLibrary come riferimento al sito Web ASP.net 5. (Poiché il framework CoreCLR non supporta System.Service Model, quindi ho rimosso quello da project.json) Framework part di project.json.

     "frameworks": { "aspnet50": { "frameworkAssemblies": { "System.ServiceModel": "" }, "dependencies": { "ClassLibrary2": "1.0.0-*" } } }, 
  5. Ora se guardi il progetto classlibrary contiene il file app.config.
  6. Copia il file e inseriscilo nella cartella wwwroot del progetto del sito web ASP.net (vnext)
  7. rinominalo in web.config.

Ora esegui la tua applicazione.

Modifica : la nuova estensione per l’aggiunta di un servizio connesso come pubblicato in altre risposte ancora non ha funzionato per me, ma ho trovato un’altra configurazione funzionante, anche se non è necessario usare dnxcore50 :

  • Avere una libreria di classi contenente il riferimento al servizio (scegliere un framework <= aspnet5 usato uno, ad esempio dnx451)
  • Fai riferimento a quello sul tuo aspnet5 facendo clic con il tasto destro sui riferimenti (creerai tutte le informazioni necessarie)
  • Disponi del modello di servizio e della dll di serializzazione necessaria nella sezione “framework” di project.json (è necessario rimuovere dnxcore)

      "dnx451": { "dependencies": { "YourClassLibWillAppearHere": "1.0.0-*" // after you reference it }, "frameworkAssemblies": { "System.ServiceModel": "4.0.0.0", "System.ServiceModel.Http": "4.0.0.0", "System.Runtime.Serialization": "4.0.0.0" } } 

Dovresti essere in grado di fare dove ne hai bisogno:

 using YourNameSpace.ServiceReference 

Vecchia risposta :

questo ha funzionato per me:

Ho seguito entrambe le istruzioni allo stesso tempo fornite sotto problemi noti per beta4 (trovare nella pagina “WCF”) a questo link:

https://github.com/aspnet/Home/releases

quindi i miei passi dove :

  1. aggiunto il riferimento al servizio su un altro progetto (libreria di classi o windows 8.1 univ app come consigliato)
  2. copiata la class di riferimento nel progetto ASP.NET 5
  3. copiato il tutto

    ...

    da app.config a web.config

  4. copiato tutti gli elenchi di dipendenze mancanti dal link sopra in project.json , sotto dipendenze comuni, lasciando da soli quelli specifici framework ( cercando di fare riferimento alla libreria di classi dotnet4.6 come una dipendenza da framework aspnet ha dato molti tipi mancanti in quel framework )

"dependencies": { >> here << }

 "frameworks": { "dnx451": { }, "dnxcore50": { } } 

Un altro potenziale modo di fare ciò che ha funzionato per me è semplicemente aggiungere un progetto dll alla soluzione e aggiungere il servizio ref qui come faresti normalmente – includere la DLL nel progetto MVC e rif per i servizi.

Hai solo bisogno di copiare il contenuto di app.config nei propri progetti mvc app.config – sì, app.config, non web.config.

Fatto