.net - example - Error de inicio del servicio WCF "Esta colección ya contiene una dirección con el esquema http"
wcf vs web api (6)
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.
Cuando despliego a nuestro servidor en vivo y ejecuto la aplicación obtengo una excepción de tipo System.ServiceModel.ServiceActivationException
que establece 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 de WCF alojados en IIS solo pueden tener una dirección base. ¿Cómo puedo evitar este problema?
¿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>
En .Net 4, puede usar la opción multipleSiteBindingsEnabled
:
<system.serviceModel>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true">
</serviceHostingEnvironment>
</system.serviceModel>
Entonces, no tendrás que especificar cada dirección.
En mi caso, la causa raíz de este problema eran múltiples enlaces http definidos en el sitio web principal, es decir, InetMgr-> Sites-> Mysite-> properties-> EditBindings. Eliminé un enlace HTTP que no era necesario y se resolvió el problema.
Resumen,
Solución de código: Here
Soluciones de configuración: Here
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 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 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.
Los baseAddresses suministrados por IIS pueden tener direcciones vinculadas a otros esquemas que no están presentes en baseAddressPrefixFilter list. Estas direcciones no serán filtradas.
Solución Dns (no probada): creo que si creara una nueva entrada dns específica para su aplicación web, añadiera un nuevo sitio web y le diera un único encabezado de host que coincida con la entrada dns, mitigaría este problema por completo, y no lo haría tiene que escribir un código personalizado o agregar prefijos a su archivo web.config.
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ó.
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 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 fue.
Idea genérica: si proporciona la dirección base como parámetro y la especifica en config, obtiene este error. Probablemente, esa no es la única forma de obtener el error, tú.