2009-05-16 329 views
33

Estoy intentando implementar un servicio WCF en mi servidor, alojado en IIS. Naturalmente funciona en mi máquina :)Cómo solucionar "no se pudo encontrar una dirección base que coincida con el esquema http" ... en WCF

Pero cuando despliego, me sale el siguiente error:

This collection already contains an address with scheme http. There can be at most one address per scheme in this collection.

buscar en Google sobre esto, me parece que tengo que poner un elemento serviceHostingEnvironment en el web.config archivo:

<serviceHostingEnvironment> 
    <baseAddressPrefixFilters> 
    <add prefix="http://mywebsiteurl"/> 
    </baseAddressPrefixFilters> 
</serviceHostingEnvironment> 

Pero una vez que he hecho esto, me sale el siguiente:

Could not find a base address that matches scheme http for the endpoint with binding BasicHttpBinding. Registered base address schemes are [https].

Parece que no sabe cuál es la dirección base, pero ¿cómo la especifico? Aquí está la sección correspondiente de mi archivo web.config:

<system.serviceModel> 
    <serviceHostingEnvironment> 
    <baseAddressPrefixFilters> 
     <add prefix="http://mywebsiteurl"/> 
    </baseAddressPrefixFilters> 
    </serviceHostingEnvironment> 

    <behaviors> 
    <serviceBehaviors> 
     <behavior name="WcfPortalBehavior"> 
     <serviceMetadata httpGetEnabled="true"/> 
     <serviceDebug includeExceptionDetailInFaults="true"/> 
     </behavior> 
    </serviceBehaviors> 
    </behaviors> 
    <bindings> 
    <basicHttpBinding> 
     <binding name="BasicHttpBinding_IWcfPortal" 
       maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" 
       receiveTimeout="00:10:00" sendTimeout="00:10:00" 
       openTimeout="00:10:00" closeTimeout="00:10:00"> 
     <readerQuotas maxBytesPerRead="2147483647" maxArrayLength="2147483647" 
       maxStringContentLength="2147483647"/> 
     </binding> 
    </basicHttpBinding> 
    </bindings> 

    <services> 
    <service behaviorConfiguration="WcfPortalBehavior" name="Csla.Server.Hosts.Silverlight.WcfPortal"> 
     <endpoint address="" binding="basicHttpBinding" contract="Csla.Server.Hosts.Silverlight.IWcfPortal" 
     bindingConfiguration="BasicHttpBinding_IWcfPortal"> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
    </service> 
    </services> 
</system.serviceModel> 

¿Alguien puede arrojar algo de luz sobre lo que está pasando y cómo solucionarlo?

+0

bueno Craig, ¿ha solucionado este problema? Permítanme ... Ahora estoy enfrentando el mismo problema :( – Lamps

+0

¿Alguna solución final al respecto? – Kiquenet

Respuesta

4

¿Existe alguna posibilidad de que su IIS esté configurado para requerir SSL en las conexiones a su sitio/aplicación?

+0

Recibo el mismo error, @tomasr e IIS está configurado para requerir SSL. ¿Será esto un problema? ¿Hay alguna manera? alrededor de esto? – StatsStudent

0

Si está alojado en IIS, no es necesario especificar una dirección base, será la dirección del directorio virtual.

+0

entonces cómo resolver el problema del OP ??!? –

0

Debe haber una manera de resolver esto bastante fácilmente con secciones de configuración externas y un paso de implementación adicional que deja caer un archivo .config externo específico de la implementación en una ubicación conocida. Normalmente utilizamos esta solución para manejar las diferentes configuraciones de servidor para nuestros diferentes entornos de despliegue (estadificación, control de calidad, producción, etc.) con nuestro "cuadro de desarrollo" siendo el predeterminado si no se produce una copia especial.

0

confirmó mi solución:

En el archivo web.config debe configurarlo para mirar como tal:

<system.serviceModel > 
    <serviceHostingEnvironment configSource=".\Configurations\ServiceHosting.config" /> 
    ... 

A continuación, construir una estructura de carpetas que tiene este aspecto:

/web.config 
/Configurations/ServiceHosting.config 
/Configurations/Deploy/ServiceHosting.config 

La base serviceHosting.config debería verse así:

<?xml version="1.0"?> 
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"> 
    <baseAddressPrefixFilters> 
    </baseAddressPrefixFilters> 
</serviceHostingEnvironment> 

mientras que el de/Implementar se parece a esto:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true"> 
    <baseAddressPrefixFilters> 
     <add prefix="http://myappname.web707.discountasp.net"/> 
    </baseAddressPrefixFilters> 
</serviceHostingEnvironment> 

Más allá de esto, es necesario agregar un paso manual o automatizada despliegue para copiar el archivo desde/Implementar overtop el que está en/Configuraciones. Esto funciona increíblemente bien para la dirección del servicio y las cadenas de conexión, y ahorra esfuerzo al realizar otras soluciones.

Si no le gusta este enfoque (que se adapta bien a las granjas, pero es más débil en una sola máquina), puede considerar agregar un archivo web.config un nivel desde la implementación del servicio en la máquina del host y colocar el nodo de ServiceHostingEnvironment allí. Debería caer en cascada para ti.

4

Si desea utilizar baseAddressPrefixFilters en web.config, también debe configurar IIS (6). Esto me ayudó:

1/En IIS encuentre su sitio. 2/Propiedades/Sitio web (pestaña)/Dirección IP -> Botón avanzado 3/Agregue un nuevo encabezado de host en el mismo puerto que usará en web.config.

37

Intente cambiar el modo de seguridad de "Transporte" a "Ninguno".

 <!-- Transport security mode requires IIS to have a 
      certificate configured for SSL. See readme for 
      more information on how to set this up. --> 
     <security mode="None"> 
+0

Muy bien - Estaba cambiando un punto final de https a http para la depuración local y olvidé cambiar el modo de seguridad = "Transporte" al modo de seguridad = "Ninguno" . Reparado. – atconway

4

Tuve que hacer dos cosas con la configuración de IIS del sitio/aplicación. Mi problema tenía que ver con conseguir net.tcp trabajando en una aplicación web del sitio de IIS:

Primero:

  1. Haga clic derecho sobre el nombre de la aplicación de IIS.
  2. Administrar sitio Web
  3. Configuración avanzada
  4. requisitos enumerados permitido ser "http, net.tcp"

Segundo:

  1. Bajo el menú de acciones en el lado derecho de la Administrador, haga clic en Vinculaciones ...
  2. Haga clic en Agregar
  3. Cambie el tipo a "net.tcp"
  4. Set información de enlace a {número de puerto abierto}: *
  5. OK
2

Sólo la primera dirección de base en la lista será asumida (procedente de IIS). No puede tener múltiples direcciones base por esquema antes de .NET4.

1

La solución es definir un enlace personalizado dentro de su archivo Web.Config y establecer el modo de seguridad en "Transporte". Luego, solo necesita usar la propiedad bindingConfiguration dentro de su definición de punto final para apuntar a su enlace personalizado.

Ver aquí: Scott's Blog: WCF Bindings Needed For HTTPS

Cuestiones relacionadas