Error de inicio del servicio WCF "Esta colección ya contiene una dirección con el esquema http"

182

Creé una aplicación web que contenía un contrato de servicio WCF y un control Silverlight que realiza llamadas a ese servicio WCF. En mis servidores de desarrollo y prueba funciona muy bien.

Cuando implemento en nuestro servidor en vivo y ejecuto la aplicación, obtengo una excepción de tipo System.ServiceModel.ServiceActivationExceptionque indica que el servicio no se puede activar debido a una excepción durante la compilación. La excepción es:

Esta colección ya contiene una dirección con el esquema http. Puede haber como máximo una dirección por esquema en esta colección.

Leí que esta excepción puede ser lanzada si el sitio web tiene más de un encabezado de host, lo cual es cierto en nuestro servidor en vivo. Aparentemente, los servicios WCF alojados en IIS solo pueden tener una dirección base. ¿Cómo puedo solucionar este problema?

Jeremy
fuente

Respuestas:

167

En .Net 4, puede usar la multipleSiteBindingsEnabledopción:

<system.serviceModel>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true">
    </serviceHostingEnvironment>
</system.serviceModel>

Entonces, no tendrá que especificar cada dirección.

http://msdn.microsoft.com/en-us/library/system.servicemodel.servicehostingenvironment.multiplesitebindingsenabled.aspx

ericvg
fuente
Sí, pero esto solo funciona con .NET 4.0 y superior. No puedo usar esto con sitios .NET 2.0 / 3.0 / 3.5.
Bytemaster
2
Nota - hay un error tipográfico aquí - no hay cierre>, por lo que si se copia y pega, que tendrá problemas
sydneyos
2
No funcionará para esta pregunta: "Esta funcionalidad solo está disponible con el protocolo HTTP".
George Tsiokos
146

Resumen,

Solución de código: aquí

Soluciones de configuración: aquí

Con la ayuda de Mike Chaliy , encontré algunas soluciones sobre cómo hacer esto a través del código. Debido a que este problema afectará a casi todos los proyectos que implementamos en un entorno en vivo, ofrecí una solución puramente de configuración. Finalmente encontré uno que detalla cómo hacerlo en .net 3.0 y .net 3.5.

Tomado del sitio, a continuación se muestra un ejemplo de cómo modificar la configuración web de sus aplicaciones:

<system.serviceModel>
    <serviceHostingEnvironment>
        <baseAddressPrefixFilters>
            <add prefix="net.tcp://payroll.myorg.com:8000"/>
            <add prefix="http://shipping.myorg.com:9000"/>
        </baseAddressPrefixFilters>
    </serviceHostingEnvironment>
</system.serviceModel>

En el ejemplo anterior, net.tcp: //payroll.myorg.com: 8000 y http://shipping.myorg.com:9000 son las únicas direcciones base, para sus respectivos esquemas, que se permitirán pasar. BaseAddressPrefixFilter no admite ningún comodín.

Las basesAddresses proporcionadas por IIS pueden tener direcciones vinculadas a otros esquemas no presentes en la lista baseAddressPrefixFilter. Estas direcciones no se filtrarán.

Solución de DNS (sin probar): creo que si crea una nueva entrada de DNS específica para su aplicación web, agrega un nuevo sitio web y le da un encabezado de host único que coincide con la entrada de DNS, mitigaría este problema por completo, y no tiene que escribir código personalizado o agregar prefijos a su archivo web.config.

Jeremy
fuente
2
Agregar el filtro de prefijo de dirección base a web.config funcionó perfectamente. Gracias Jeremy!
Mike737
2
No puedo pensar en ninguna razón por la que uno quisiera tal restricción, y mucho menos la configuración predeterminada ...
#
42
Estoy empezando a pensar mal sobre WCF en combinación con ASP.net y los servicios web a los que se accede a través de JavaScript. Tuve muchos menos problemas con los viejos servicios ASMX ...
Juri
Ok, ¿qué pasa si tiene un sitio con una combinación de aplicaciones .net 4 y .net 2 ejecutándose debajo de él? La base de la aplicación es .net4 y hay varias aplicaciones que requieren .net2. ¿Utiliza <serviceHostingEnvironment multipleSiteBindingsEnabled = "true"> en todos los archivos .net4 y el prefijo en las aplicaciones .net 2?
Travis
59

¿Viste esto? Http://kb.discountasp.net/KB/a799/error-accessing-wcf-service-this-collection-already.aspx

Puede resolver este error cambiando el archivo web.config.

Con ASP.NET 4.0, agregue las siguientes líneas a su web.config:

<system.serviceModel> 
     <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
</system.serviceModel> 

Con ASP.NET 2.0 / 3.0 / 3.5, agregue las siguientes líneas a su web.config:

<system.serviceModel> 
     <serviceHostingEnvironment> 
          <baseAddressPrefixFilters> 
               <add prefix="http://www.YourHostedDomainName.com"/> 
          </baseAddressPrefixFilters> 
     </serviceHostingEnvironment> 
</system.serviceModel> 
Mike Chaliy
fuente
Gracias. Continuaré buscando para ver si no hay una solución de código. Algo que se puede hacer en la configuración porque esto afectará cualquier proyecto que hagamos, espero no tener que escribir código personalizado.
Jeremy
16

En mi caso, la causa raíz de este problema fue múltiples enlaces http definidos en el sitio web principal, es decir, InetMgr-> Sitios-> Mysite-> propiedades-> EditBindings. Eliminé un enlace http que no era necesario y el problema se resolvió.

Amar
fuente
1
Sí, Amar esto fue muy útil, en mi caso fue OTRO sitio web con múltiples enlaces lo que lo rompió. Disponible externamente en la misma máquina (pero con un nombre de host diferente). Del mismo modo, podría solucionarse agregando la configuración multipleSiteBindingsEnabled, pero luego web.config sería diferente de todos los demás entornos.
The Coder
2
Es una pena que esto esté en la parte inferior. En nuestro caso esto nos lo arregló.
brendonparker
Me ayudó a replicar el error en el entorno de desarrollo. No puedo editar enlaces de sitios web ni en entornos de certificación ni en vivo. ¡Cambié mi archivo de hosts para simular un dominio y agregué enlaces a IIS y bam locales!
MFedatto
8

Y en mi caso fue simple: utilicé el asistente 'Agregar servicio WCF' en Visual Studio, que creó automáticamente las secciones correspondientes en app.config. Luego seguí leyendo Cómo: alojar un servicio WCF en una aplicación administrada . El problema era: no necesitaba especificar la url para ejecutar el servicio web.

Reemplazar:

using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))

Con:

using (ServiceHost host = new ServiceHost(typeof(HelloWorldService))

Y el error se ha ido.

Idea genérica: si proporciona la dirección base como parámetro y la especifica en la configuración, obtendrá este error. Probablemente, esa no sea la única forma de obtener el error, tú.

bohdan_trotsenko
fuente
Resuelto mi problema
QShengyao
2

Tuve este problema y la causa fue bastante tonta. Estaba probando la demostración de Microsoft con respecto a ejecutar un ServiceHost desde w / en un ejecutable de línea de comandos. Seguí las instrucciones, incluido dónde dice agregar el Servicio (y la interfaz) apropiados. Pero obtuve el error anterior.

Resulta que cuando agregué la clase de servicio, VS agregó automáticamente la configuración a la app.config. Y la demostración también estaba tratando de agregar esa información. Como ya estaba en la configuración, eliminé la parte de demostración y funcionó.

Eric
fuente
0

Llegué por el mismo error en un viejo 2010 Exchange Server. Un servicio (servicio de replicación de buzones de Exchange) estaba dando el error anterior y el proceso de migración no pudo continuar. Buscando a través de Internet, llegué a este enlace que decía lo siguiente:

Exchange GRE no se abre cuando se instala por primera vez o si se realizan cambios en el servidor IIS. Se produce un error con el complemento y cuando intenta abrir la página del complemento, se muestra el siguiente contenido:

This collection already contains an address with scheme http.  There can be at most one address per scheme in this collection. If your service is being hosted in IIS you can fix the problem by setting 'system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled' to true or specifying 'system.serviceModel/serviceHostingEnvironment/baseAddressPrefixFilters'."

Causa : este error se produce porque el puerto http número 443 ya está en uso por otra aplicación y el servidor IIS no está configurado para manejar enlaces múltiples al mismo puerto.

Solución : configure el servidor IIS para manejar varios enlaces de puertos. Póngase en contacto con el proveedor (Microsoft) para configurarlo.

Dado que estos servicios se ofrecieron desde un servidor web IIS, la comprobación de los enlaces en el sitio raíz solucionó el problema. Alguien había estropeado los enlaces del sitio, definiendo reglas que se superponían y arruinó los servicios.

La fijación de los enlaces correctos resolvió el problema, en mi caso, y no tuve que configurar el Web.Config.

jimas13
fuente