2009-02-18 34 views
167

Creé una aplicación web que contiene un contrato de servicio WCF y un control Silverlight que realiza llamadas a ese servicio WCF. En mis servidores de desarrollo y prueba funciona de maravilla.Error de inicio del servicio WCF "Esta colección ya contiene una dirección con el esquema http"

Cuando despliego a nuestro servidor activo y ejecuto la aplicación obtengo una excepción de tipo System.ServiceModel.ServiceActivationException que 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.

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

Respuesta

141

Resumen,

solución Código: Here

soluciones de configuración: Here

Con la ayuda de Mike Chaliy, he encontrado algunas soluciones sobre cómo hacer esto a través de código. Debido a que este problema va a 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 es un ejemplo de cómo modificar sus aplicaciones web.config:

<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 esquemas respectivos , que serán permitidos pasar. El baseAddressPrefixFilter no admite ningún comodín.

Los baseAddresses suministrados por IIS pueden han direcciones con destino a otros esquemas no está presente en la lista baseAddressPrefixFilter .Estas direcciones no serán filtradas.

solución DNS (no probado): creo que si ha creado una nueva entrada DNS específico para su aplicación web, añade un nuevo sitio web, y se dio un solo encabezado de host a juego de la entrada DNS, mitigaría este problema por completo, y no tendría que escribir código personalizado o agregar prefijos a su archivo web.config.

+2

Agregar el filtro de prefijo de dirección base al web.config funcionó perfectamente. Gracias Jeremy! – Mike737

+2

No puedo pensar en ninguna razón por la que uno quiera una restricción así, mucho menos la configuración predeterminada ... – pbz

+42

Estoy empezando a pensar mal sobre WCF en combinación con ASP.net y servicios web a los que se accede a través de JavaScript. Tuve muchos menos problemas con los antiguos servicios ASMX simples ... – Juri

48

¿Has visto esto - http://kb.discountasp.net/KB/a799/error-accessing-wcf-service-this-collection-already.aspx

Usted puede resolver este error cambiando el archivo web.config.

con ASP.NET 4.0, añada las siguientes líneas a su web.config:

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

con ASP.NET 2.0/3.0/3.5, añada las siguientes líneas a su web.config :

<system.serviceModel> 
    <serviceHostingEnvironment> 
      <baseAddressPrefixFilters> 
       <add prefix="http://www.YourHostedDomainName.com"/> 
      </baseAddressPrefixFilters> 
    </serviceHostingEnvironment> 
</system.serviceModel> 
+0

Gracias. Voy a continuar buscando para ver si hay una solución que no sea de código. Algo que se puede hacer en la configuración porque esto va a afectar cualquier proyecto que hagamos. Espero no tener que escribir código personalizado. – Jeremy

+0

Esta es la mejor respuesta en el hilo. – MFedatto

151

En .Net 4, puede utilizar la opción multipleSiteBindingsEnabled:

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

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

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

+0

Sí, pero esto solo funciona con .NET 4.0 y superior. No se puede usar esto con los sitios .NET 2.0/3.0/3.5. – Bytemaster

+2

Nota: aquí hay un error tipográfico, no hay cierre>, de modo que si copia y pega, tendrá problemas – sydneyos

+2

No funcionará para esta pregunta: "Esta funcionalidad solo está disponible con el protocolo HTTP". –

14

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

+1

Sí, esto fue muy útil; en mi caso, fue * OTRO * sitio web con enlaces múltiples que lo rompió. Externamente disponible 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 la web.config sería diferente de todos los demás entornos. –

+2

Es una pena que esté en la parte inferior. En nuestro caso, esto lo solucionó para nosotros. – brendonparker

+0

Me ayudó a replicar el error en el entorno de desarrollo. No puedo editar enlaces de sitio web ni en certificación ni en entornos en vivo. Cambié mi archivo de hosts para simular un dominio y agregué enlaces a IIS local y bam! – MFedatto

5

Y en mi caso fue simple: utilicé el asistente 'Agregar WCF Service' en Visual Studio, que creó automáticamente las secciones correspondientes en app.config. Luego seguí leyendo How to: Host a WCF Service in a Managed Application. El problema era: no necesité 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 un parámetro y especifíquelo en la configuración, obtendrá este error. Probablemente, esa no es la única forma de obtener el error, tú.

+0

Ha solucionado mi problema. – QShengyao

1

Tuve este problema, y ​​la causa fue bastante tonta. Estaba probando la demostración de Microsoft sobre la ejecución de un ServiceHost desde w/en un ejecutable de la línea de comandos. Seguí las instrucciones, incluso donde dice agregar el Servicio (y la interfaz) correspondiente. 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 intentaba agregar esa información. Como ya estaba en la configuración, eliminé la parte de demostración y funcionó.

Cuestiones relacionadas