2011-09-23 29 views
6

Nonostante la lettura di un numero di post, ad esempio (This one seems popular), non riesco a esporre il mio servizio come endpoint multipli compatibili con entrambi i protocolli SOAP e REST - il mio problema sembra essere conWCF REST e SOAP Service senza WebServiceHostFactory

Factory="System.ServiceModel.Activation.WebServiceHostFactory" 

elemento nella pagina Codice servizio dietro.

Se lascio perdere, il mio endpoint SOAP funziona in modo grandioso, ma il mio endpoint JSON non viene trovato. Se inserisco la linea, il mio endpoint REST canta come un uccello e l'endpoint SOAP restituisce "Endpoint non trovato" nella pagina Service.svc.

mie operazioni sembrano configurare nel modo standard per esempio:

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

E il file di configurazione

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

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

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

Come posso raggiungere questo obiettivo? C'è un modo per impostare il resto endpoint senza l'attributo System.ServiceModel.Activation.WebServiceHostFactory?

Grazie in anticipo.

+0

http: //www.c-sharpcorner.com/uploadfile/dhananjaycoder/windows-authentication-on-rest-enabled-wcf-service/ – MaxRecursion

risposta

5

Se non si specifica alcuna fabbrica nel file .svc, tutti gli endpoint arriveranno dal file web.config - WCF cercherà di trovare un elemento <system.serviceModel/service> cui name attributo corrisponde al nome pienamente qualificato di la classe di servizio. Se non ne trova uno, aggiungerà un endpoint predefinito (utilizzando basicHttpBinding, a meno che non si sia modificato il mapping predefinito). Sembra essere quello che stai affrontando. Verificare che l'attributo "nome" dell'elemento <service> corrisponda al valore dell'attributo Service nel file .svc, e si dovrebbe avere i due punti finali a lavorare bene.

Un'altra cosa che puoi provare è abilitare la traccia nel servizio (livello = Informazioni) per vedere quali endpoint sono stati effettivamente aperti sul servizio. L'immagine qui sotto:

SvcTraceViewer image

Il server per questo esempio è niente di grave:

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

Il Service.svc non dispone di fabbrica specificato:

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

e il web .config definisce due punti finali, che sono mostrati nelle tracce:

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

Si noti che nell'ascoltatore è presente un listener aggiuntivo, è la "pagina di aiuto" di WCF (quella che indica, quando si accede ad essa, che il servizio non ha abilitato i metadati).

Puoi provare a confrontare questa configurazione con la tua o iniziare con questa semplice, quindi iniziare ad aggiungere componenti dalla tua fino a quando non avrai risolto il problema. Ciò aiuterà a isolare il problema.

Buona fortuna!

+0

Grazie per la ricerca, sì il nome del servizio specificato nel file di configurazione nome = "MeterService" corrisponde al "nome" nel MeterService. file SVC (ad es. Service = "MeterService"). Deve avere qualcosa a che fare con il mio endpoint o configurazione del servizio, non sono sicuro di cosa. – Simian

+0

Ho aggiornato la mia risposta con un semplice esempio che funziona; puoi provare a guardarlo per vedere se c'è qualcosa di diverso dal tuo. – carlosfigueira

Problemi correlati