2011-09-23 4 views
6

En dépit de lire un certain nombre de messages par exemple (This one seems popular) je ne peux pas sembler exposer mon service en tant que points de terminaison multiples qui sont compatibles avec le protocole SOAP et REST - mon problème semble être avec leService WCF REST et SOAP sans WebServiceHostFactory

Factory="System.ServiceModel.Activation.WebServiceHostFactory" 
élément

dans le code de service behind. Si je l'omets, mon point de terminaison SOAP fonctionne grand, mais mon point de terminaison JSON n'est pas trouvé. Si je mets la ligne, mon point de terminaison REST chante comme oiseau et le point de terminaison SOAP se traduit par "Endpoint not found" sur la page Service.svc.

Mes opérations semblent mettre en place de façon standard, par exemple:

[OperationContract] 
    [WebGet(UriTemplate = "/GetData", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)] 
    string GetData(); 

Et le fichier de configuration

<endpoint address="rest" binding="webHttpBinding" contract=".IMeterService" behaviorConfiguration="REST" /> 

<endpoint address="soap" binding="wsHttpBinding" contract="IMeterService" bindingConfiguration="secureBasic" /> 

<behavior name="REST"> 
     <webHttp /> 
</behavior> 

Comment puis-je y parvenir? Existe-t-il un moyen de configurer le point de terminaison REST sans l'attribut System.ServiceModel.Activation.WebServiceHostFactory?

Merci d'avance.

+0

http: //www.c-sharpcorner.com/uploadfile/dhananjaycoder/windows-authentification-sur-repos-enabled-wcf-service/ – MaxRecursion

Répondre

5

Si vous ne spécifiez pas d'usine dans le fichier .svc, tous les points d'extrémité viennent du fichier web.config - WCF va essayer de trouver un élément <system.serviceModel/service> dont name attribut correspond au nom complet de la classe de service. S'il n'en trouve pas, il ajoutera un point de terminaison par défaut (en utilisant basicHttpBinding, sauf si vous avez modifié le mappage par défaut). Cela semble être ce à quoi vous faites face. Confirmez que l'attribut "name" de l'élément <service> correspond à la valeur de l'attribut Service dans le fichier .svc, et que les deux extrémités doivent fonctionner correctement.

Une autre chose que vous pouvez essayer est d'activer le suivi dans le service (niveau = Information) pour voir quels points de terminaison ont été réellement ouverts sur le service. L'image ci-dessous:

SvcTraceViewer image

Le serveur pour cet exemple est rien de majeur:

namespace MyNamespace 
{ 
    [ServiceContract] 
    public interface ITest 
    { 
     [OperationContract] 
     string Echo(string text); 
    } 
    public class Service : ITest 
    { 
     public string Echo(string text) 
     { 
      return text; 
     } 
    } 
} 

Le Service.svc ne dispose pas d'usine spécifiée:

<% @ServiceHost Service="MyNamespace.Service" Language="C#" debug="true" %> 

Et le web .config définit deux points d'extrémité, qui sont affichés dans les traces:

<configuration> 
    <system.diagnostics> 
     <sources> 
      <source name="System.ServiceModel" switchValue="Information, ActivityTracing" 
       propagateActivity="true"> 
       <listeners> 
        <add type="System.Diagnostics.DefaultTraceListener" name="Default"> 
         <filter type="" /> 
        </add> 
        <add name="ServiceModelTraceListener"> 
         <filter type="" /> 
        </add> 
       </listeners> 
      </source> 
     </sources> 
     <sharedListeners> 
      <add initializeData="C:\temp\web_tracelog.svclog" type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
       name="ServiceModelTraceListener" traceOutputOptions="Timestamp"> 
       <filter type="" /> 
      </add> 
     </sharedListeners> 
     <trace autoflush="true"/> 
    </system.diagnostics> 
    <system.serviceModel> 
     <behaviors> 
      <endpointBehaviors> 
       <behavior name="Web"> 
        <webHttp /> 
       </behavior> 
      </endpointBehaviors> 
     </behaviors> 
     <services> 
      <service name="MyNamespace.Service"> 
       <endpoint address="basic" binding="basicHttpBinding" bindingConfiguration="" 
        name="basic" contract="MyNamespace.ITest" /> 
       <endpoint address="web" behaviorConfiguration="Web" binding="webHttpBinding" 
        bindingConfiguration="" name="web" contract="MyNamespace.ITest" /> 
      </service> 
     </services> 
    </system.serviceModel> 
</configuration> 

Notez qu'il existe un écouteur supplémentaire affiché dans l'écouteur, il s'agit de la "page d'aide" de WCF (celle qui indique, lorsque vous y accédez, que les métadonnées du service ne sont pas activées).

Vous pouvez essayer de comparer cette configuration avec la vôtre, ou commencer par celle-ci simple, puis commencer à ajouter un composant à partir du vôtre jusqu'à ce que vous rencontriez le problème. Cela aidera à isoler le problème.

Bonne chance!

+0

Merci de regarder, oui le nom du service tel que spécifié dans le fichier de configuration name = "MeterService" correspond au "nom" dans le MeterService. fichier svc (par exemple Service = "MeterService"). Cela doit avoir quelque chose à voir avec ma configuration de point de terminaison ou de service, je ne suis pas sûr de quoi. – Simian

+0

J'ai mis à jour ma réponse avec un exemple simple qui fonctionne; vous pouvez essayer de le regarder pour voir s'il y a quelque chose de différent du vôtre. – carlosfigueira

Questions connexes