2009-11-01 12 views
11

Creé un Serice WCF que funcionaba bien cuando estaba alojado en IIS.Excepción de operación no válida

ahora, me tomó el mismo servicio, y ha creado un programa de control en WPF, y al intentar iniciar el servicio desde esa aplicación, me sale esta excepción:

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

¿cuál es su código para crear el proxy? – Dani

+0

productsServiceHost = new ServiceHost (typeof (Products.ProductsService)); productosServiceHost.Open(); stop.IsEnabled = true; start.IsEnabled = false; status.Text = "Servicio en ejecución ..."; – Attilah

Respuesta

22

El error es bastante clara - usted está utilizando HTTP, ha habilitado HttpGetEnabled en su comportamiento de ServiceMetadata, pero no ha proporcionado una dirección base en su configuración.

En IIS, las direcciones base no son necesarias ni utilizadas, ya que la ubicación del archivo * .svc define su dirección de servicio. Cuando es autohospedado, puede y debe usar direcciones base.

Cambiar la configuración para ser algo como esto:

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

Ahora, el "HttpGetEnabled" tiene una dirección base http://localhost.8080/YourService para ir a conseguir los metadatos de.

O si no te gusta esto, de nuevo, el mensaje de error es bastante claro en su alternativa: definir una URL absoluta para el HttpGetUrl en su ServiceMetadata:

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

Los clientes pueden obtener los metadatos de sus puntos finales "mex", ya sea en una URL fija definida como en este segundo ejemplo, o irán a la dirección base del servicio para los metadatos (si hay uno).

Si viene de IIS y no ha adaptado nada, no tendrá ni una dirección base, ni una URL explícita y absoluta para su punto final de intercambio de metadatos, entonces es por eso que obtiene el error que está viendo .

Marc

+1

Terminé aquí con el mismo problema, pero no porque no estaba seguro de qué hacer. Más bien, no sabía qué buscar para agregar una "dirección base" a mi configuración. ¿Qué recurso usó para determinar la existencia y la sintaxis de las propiedades '' y ''? – Matt

0

me enfrentaba a este error cuando intenté usar net.pipe binding.In mi caso, el comportamiento de servicio por defecto publicó los metadatos del servicio, esta es la causa de mi error. Mi solución es usar un comportamiento diferente para sus servicios. , Luego cambié de archivo de configuración de acuerdo con @marc_s responder y realizar diferentes comportamientos de servicios de la siguiente manera:

<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

Compruebe que la clase de servicio es correcta.

Ha resuelto mi problema

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