web-dev-qa-db-fra.com

Comment utiliser le service Web WCF via une URL au moment de l'exécution?

Je souhaite accéder à toutes les méthodes exposées dans le service via l'URL. si supposons l'URL sera:

http://localhost/MyService/MyService.svc

Comment puis-je accéder aux méthodes:

  1. si supposons que j'ai un ServiceReference
  2. et que dois-je faire si je n'ai pas la référence de service.
15
Ashish Ashu

Pour utiliser un service WCF, vous devez créer un proxy client WCF.

Dans Visual Studio, cliquez avec le bouton droit de la souris sur le projet et choisissez "Ajouter une référence de service" dans le menu contextuel. Tapez l'URL à laquelle vous souhaitez vous connecter et si ce service est en cours d'exécution, vous devez générer un fichier proxy client pour vous.

Ce fichier contiendra généralement une classe appelée MyService Client - vous pouvez instancier cette classe et vous devriez voir toutes les méthodes disponibles sur cette classe client à votre disposition.

Si vous ne souhaitez pas ajouter de référence de service dans Visual Studio, vous pouvez obtenir le même résultat en exécutant l'outil de ligne de commande svcutil.exe. Il générera également tous les fichiers nécessaires à votre classe de proxy client.

Marc

METTRE À JOUR:
si vous souhaitez initialiser un proxy client au moment de l'exécution, vous pouvez le faire. Vous devez choisir la liaison à utiliser (protocole de transport) et l'adresse à laquelle vous connecter, puis procéder comme suit:

BasicHttpBinding binding = new BasicHttpBinding();
EndpointAddress address = new EndpointAddress("http://localhost:8888/MyService");

MyServiceClient serviceClient = new MyServiceClient(binding, address);

Mais même dans ce cas, vous devez d'abord importer et créer le client proxy à l'aide des outils "Ajouter une référence de service" ou svcutil.exe.

20
marc_s

Pour répondre comment faire sans avoir une référence de service. Regardez ici (option #a):

Écrire votre premier client WCF

Vous avez encore besoin d'une référence (à savoir une référence à un assembly contenant le contrat/l'interface), mais vous ne faites pas de référence de service.

EDIT: Bien que ce qui précède soit possible, je ne le recommanderais pas. Les performances ne sont pas vraiment géniales lorsque vous devez générer des mandataires comme celui-ci. J'utilise généralement svcutil.exe et crée un assembly contenant mes clients et crée une référence à cet assembly. De cette manière, vous avez plus d’options pour contrôler l’apparence des mandataires.

8
Stefan Egli

Vous pouvez également utiliser la classe WebClient pour appeler le service WCF sans avoir besoin d'un proxy de service. Vous pouvez effectivement envoyer et recevoir des chaînes et des données binaires, ainsi que simuler des POST.

Je l'utilise beaucoup pour les composants réutilisables où le développeur peut ne jamais créer les méthodes proxy requises. Une bonne comparaison des façons de faire POST est disponible ici .

2
BinaryMisfit

Vous l’appelez avec un/nom_fonction, par exemple:

http: //localhost/MyService/MyService.svc/GetVersionNumber

 enter image description here

Modifier:

Comment configurez-vous votre méthode dans le service WCF pour pouvoir l'appeler directement à partir du navigateur?

J'ai une interface:

[ServiceContract]
public interface IWebServiceImpl
{
    [OperationContract]
    [WebInvoke(Method = "GET",
        ResponseFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.Bare,
        UriTemplate = "GetVersionNumber")]
    string GetVersionNumber();

Et une classe pour implémenter la méthode GetVersionNumber dans l'interface:

public class WebServiceImpl
{
    public string GetVersionNumber()
    {
            return "1.0.0.0"; //In real life this isn't hard-coded
    }
}

Enfin, voici la configuration Web.config:

<system.serviceModel>        
    <diagnostics>
      <messageLogging logEntireMessage="true" logMalformedMessages="false" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="false" maxMessagesToLog="3000" maxSizeOfMessageToLog="2000"/>
    </diagnostics>        
    <bindings>
      <webHttpBinding>
        <binding name="webBinding">
          <security mode="Transport"/>
        </binding>
      </webHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="ServiceBehaviour" name="YOURWebServiceNameSpace.WebServiceImpl">            
        <endpoint address="" behaviorConfiguration="web" binding="webHttpBinding" contract="YOURWebServiceNameSpace.IWebServiceImpl"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehaviour">
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="web">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
1
Jeremy Thompson

Vous pouvez simplement fournir le wsdl de votre service: http: //localhost/MyService/MyService.svc? Wsdl .

À partir de WSDL, vous pouvez générer des classes de proxy et les utiliser sur le client.

0
sandyiit