2009-11-01 24 views
11

Ho creato un Serice WCF che funzionava correttamente quando era ospitato su IIS.Eccezione Operazione non valida

ora, ho preso lo stesso servizio, e ha creato un'applicazione host in WPF, e quando si cerca di avviare il servizio da tale applicazione, ottengo questa eccezione:

The HttpGetEnabled property of ServiceMetadataBehavior is set to true and the 
HttpGetUrl property is a relative address, but there is no http base address. 
Either  supply an http base address or set HttpGetUrl to an absolute address. 
+0

qual è il tuo codice per creare il proxy? – Dani

+0

productsServiceHost = new ServiceHost (typeof (Products.ProductsService)); productsServiceHost.Open(); stop.IsEnabled = true; start.IsEnabled = false; status.Text = "Servizio in esecuzione ..."; – Attilah

risposta

22

L'errore è abbastanza chiaro - si Stai usando HTTP, hai abilitato HttpGetEnabled sul tuo comportamento di ServiceMetadata, ma non hai fornito un indirizzo di base nella tua configurazione.

In IIS, gli indirizzi di base non sono né necessari né utilizzati, poiché l'ubicazione del file * .svc definisce l'indirizzo del servizio. Quando sei auto-hosting, puoi e dovresti usare gli indirizzi di base.

Cambia la tua config per cercare qualcosa di simile:

<system.serviceModel> 
    <services> 
    <service name="YourService"> 
     <host> 
     <baseAddresses> 
      <add baseAddress="http://localhost:8080/YourService" /> 
     </baseAddresses> 
     </host> 
     <endpoint address="mex" binding="mexHttpBinding" 
       contract="IMetadataExchange" /> 
     ..... (your own other endpoints) ........... 
    </service> 
    </services> 
</system.serviceModel> 

Ora, il "httpGetEnabled" ha un indirizzo di base http://localhost.8080/YourService per andare per ottenere i metadati da.

Oppure, se non ti piace questo, ancora una volta, il messaggio di errore è abbastanza chiaro sulla vostra alternativa: definire un URL assoluto per il HttpGetUrl nel ServiceMetadata:

<serviceBehaviors> 
    <behavior name="Default"> 
     <serviceMetadata 
      httpGetEnabled="true" 
      httpGetUrl="http://localhost:8282/YourService/mex" /> 
    </behavior> 
    </serviceBehaviors> 

I clienti possono ottenere i metadati da i tuoi endpoint "mex", a un URL fisso definito come in questo secondo esempio, oppure andranno all'indirizzo di base del servizio per i metadati (se ce n'è uno).

Se provieni da IIS e non hai adattato nulla, non avrai né un indirizzo di base né un URL assoluto esplicito per il tuo endpoint di scambio Metadata, ecco perché ottieni l'errore che stai vedendo .

Marc

+1

Sono finito qui con lo stesso problema, ma non perché non sapessi cosa fare. Piuttosto, non sapevo cosa cercare per aggiungere un "indirizzo base" alla mia configurazione. Quale risorsa hai usato per determinare l'esistenza e la sintassi delle proprietà '' e ''? – Matt

0

ho affrontato questo errore quando ho provato ad usare net.pipe binding.In mio caso, il comportamento del servizio predefinito pubblicato i metadati di servizio, questa è la causa del mio errore. La mia soluzione è usare un comportamento diverso per i tuoi servizi. , Poi ho cambiato il mio file di configurazione in base alle @marc_s risposta e fare comportamenti di servizi diversi come segue:

<serviceBehaviors> 
     <!--Default behavior for all services (in my case net pipe binding)--> 
     <behavior > 

      <serviceMetadata httpGetEnabled="false" httpsGetEnabled="false" /> 

      <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
     <!--for my http services --> 
     <behavior name="MyOtherServiceBehavior"> 

      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 

      <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
     </serviceBehaviors> 
0

Verificare che la classe di servizio è corretta.

E 'risolto il mio problema

// Create a ServiceHost for the CalculatorService type and 
// provide the base address. 
serviceHost = new ServiceHost(typeof(ServiceClass)); 
Problemi correlati