web-dev-qa-db-fra.com

ASP.NET 5 ajouter une référence de service WCF

Dans Visual Studio 2015 Preview (version préliminaire), comment puis-je ajouter une référence de service pour un service WCF?

26
heymega

Actuellement, il s'agit d'un processus assez complexe car l'outillage ne semble pas prendre en charge beaucoup la manière de générer le code client WCF ou de mapper automatiquement à partir des fichiers de configuration. En outre, comme l'a souligné dotnetstep, l'équipe ASP.NET n'a pas porté System.ServiceModel à 5 pour le moment (ou fourni une alternative pour les clients WCF encore ). Néanmoins, nous pouvons utiliser une approche basée sur le code pour créer un proxy client et utiliser svcutil pour générer nos classes de référence de service.

Prérequis de la solution

Pour cet exemple, je suppose que vous hébergez localement un service à http: // localhost: 5000/MapService.svc qui implémente un contrat IMapService. De plus, nous appellerons le projet qui va contenir le proxy de service MapClient.

Votre project.json devrait ressembler à:

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

Générer les classes de référence de service

Commençons par créer un dossier, Service References, dans le projet MapClient.

Ensuite, ouvrez l'invite de commande du développeur pour VS2015 et accédez à votre répertoire de projet MapClient:

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

Assurez-vous que MapService est en cours d'exécution et exécutez la commande suivante:

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

Cela devrait générer deux fichiers, output.config et MapServiceReference.cs.

Créer un proxy client basé sur le code

Puisqu'il n'y a aucun moyen de mapper automatiquement le point de terminaison et la configuration de liaison d'un fichier de configuration à votre ClientBase actuellement dans ASP.NET 5, le output.config ne nous est pas très utile. Vous pouvez le supprimer.

Au lieu de cela, créons un proxy client dans le code:

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<IMapService> channelFactory = new ChannelFactory<IMapService>(binding, endpoint);
            IMapService clientProxy = channelFactory.CreateChannel();

            var map = clientProxy.GetMap();

            channelFactory.Close();
        }
    }
}

Vous pouvez maintenant utiliser l'instance clientProxy pour accéder à n'importe quel contrat d'opération dans IMapService.

En tant que sidenote, il serait probablement préférable de créer un fichier de configuration key: value qui stocke votre configuration de liaison et de point de terminaison et utilise le Microsoft.Framework.ConfigurationModel.Configuration objet pour remplir votre ChannelFactory afin que vous puissiez garder votre configuration de service hors de votre code, mais j'espère que cet exemple vous aidera à démarrer.

41
Carrie Kendall

Il existe une nouvelle extension Visual Studio qui vous permet d'ajouter et d'utiliser des références de service comme dans les versions précédentes. Il est également compatible avec le nouveau CoreCLR, je viens de le tester.

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

9
wodzu

Edit: La nouvelle extension pour ajouter un service connecté comme posté dans d'autres réponses ne fonctionnait toujours pas pour moi, mais j'ai trouvé une autre configuration de travail, bien qu'elle nécessite vous n'utilisez pas dnxcore50:

  • Avoir une bibliothèque de classes contenant la référence du service (choisissez un framework <= aspnet5 utilisé, par exemple dnx451)
  • Référencez celui-ci dans votre aspnet5 avec un clic droit sur les références (créera tous les éléments d'enveloppement)
  • Avoir le modèle de service et la DLL de sérialisation nécessaire dans la section "framework" de project.json (le dnxcore doit être supprimé)

         "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"
           }
         }   
    

Vous devriez pouvoir faire où vous en avez besoin:

using YourNameSpace.ServiceReference

Ancienne réponse:

cela a fonctionné pour moi:

J'ai suivi les deux instructions en même temps fournies sous problèmes connus pour beta4 (trouver dans la page "WCF") sur ce lien:

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

donc mes pas où:

  1. référence de service ajoutée à un autre projet (bibliothèque de classes ou application Windows 8.1 univ comme conseillé)
  2. copié la classe de référence dans le projet ASP.NET 5
  3. copié le tout

    <system.serviceModel>...

    de app.config à web.config

  4. copié toutes ces listes de dépendances manquantes à partir du lien ci-dessus dans project.json , sous les dépendances communes, en laissant seules les frameworks spécifiques ( essayant de référencer la bibliothèque de classes dotnet4.6 comme une dépendance du framework aspnet a donné de nombreux types manquants dans ce framework)

"dependencies": { >> here << }

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

Une autre façon possible de le faire qui a fonctionné pour moi est d'ajouter simplement un projet dll à la solution et d'ajouter la référence de service ici comme vous le feriez normalement - incluez la dll dans le projet MVC et la référence pour les services.

Il vous suffit de copier le contenu de app.config dans le propre projet mvc app.config - oui, app.config, pas web.config.

Terminé

3
Monolithcode

Actuellement, aucun outil n'est disponible pour cela et une raison possible pour ce System.ServiceModel qui n'est pas disponible dans asp.netcore5.

Si vous avez décidé d'utiliser ASP.net 5, vous pouvez faire la chose suivante pour utiliser le service WCF (j'utilise Visual Studio 2015 CTP 5 pour cette réponse)

Dans VS 2015 CTP 5, il nous permet d'ajouter une référence de bibliothèque de classe régulière.

  1. Créez le service WCF.
  2. Créer une bibliothèque de classes régulières (je choisis .NET Framework 4.6)
  3. Après cela, j'ai ajouté la référence de service WCF à ClassLibrary.
  4. Ajoutez ClassLibrary comme référence au site Web ASP.net 5. (Étant donné que le framework CoreCLR ne prend pas en charge le modèle System.Service, j'ai supprimé celui-ci de project.json). Une partie du framework de project.json.

    "frameworks": {
    "aspnet50": {
        "frameworkAssemblies": {
             "System.ServiceModel": ""
         },
        "dependencies": {
             "ClassLibrary2": "1.0.0-*"
         }
       }
    },
    
  5. Maintenant, si vous regardez le projet classlibrary, il contient le fichier app.config.
  6. Copiez ce fichier et placez-le dans le dossier wwwroot du projet de site Web ASP.net (vnext)
  7. renommez-le en web.config.

Exécutez maintenant votre application.

3
dotnetstep