consume - Cómo solucionar "no se pudo encontrar una dirección base que coincida con el esquema http"... en WCF
wcf certificate authentication (9)
Estoy intentando implementar un servicio WCF en mi servidor alojado en IIS. Naturalmente, funciona en mi máquina :)
Pero cuando lo despliegue, aparece el siguiente error:
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.
Buscando en Google, me parece que tengo que poner un elemento serviceHostingEnvironment en el archivo web.config:
<serviceHostingEnvironment>
<baseAddressPrefixFilters>
<add prefix="http://mywebsiteurl"/>
</baseAddressPrefixFilters>
</serviceHostingEnvironment>
Pero una vez que he hecho esto, obtengo lo siguiente:
No se pudo encontrar una dirección base que coincida con el esquema http para el punto final con enlace BasicHttpBinding. Los esquemas de direcciones base registradas son [https].
Parece que no sabe cuál es la dirección base, pero ¿cómo la especifico? Aquí está la sección relevante 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?
¿Alguna posibilidad de que su IIS esté configurado para requerir SSL en las conexiones a su sitio / aplicación?
Confirmado mi solución:
En su archivo web.config, debe configurarlo para que se vea así:
<system.serviceModel >
<serviceHostingEnvironment configSource="./Configurations/ServiceHosting.config" />
...
Luego, construya una estructura de carpetas que se vea así:
/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 / Desplegar se ve así:
<serviceHostingEnvironment aspNetCompatibilityEnabled="true">
<baseAddressPrefixFilters>
<add prefix="http://myappname.web707.discountasp.net"/>
</baseAddressPrefixFilters>
</serviceHostingEnvironment>
Más allá de esto, debe agregar un paso de implementación manual o automatizado para copiar el archivo de / Desplegar sobre el de / 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 a un nivel superior de la implementación del servicio en la máquina del host y colocar allí el nodo serviceHostingEnvironment. Debería caer en cascada para ti.
Debería haber una manera de resolver esto bastante fácilmente con secciones de configuración externas y un paso de implementación adicional que coloca un archivo .config externo específico del despliegue 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.
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">
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.
Si desea usar 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 / Agregar nuevo encabezado de host en el mismo puerto que usará en web.config.
Si está alojado en IIS, no es necesario especificar una dirección base, será la dirección del directorio virtual.
Solo se asumirá la primera dirección base de la lista (proveniente de IIS). No puede tener múltiples direcciones base por esquema antes de .NET4.
Tuve que hacer dos cosas con la configuración de IIS del sitio / aplicación. Mi problema tenía que ver con hacer que net.tcp trabaje en una aplicación de sitio web de IIS:
Primero:
- Haga clic derecho en el nombre de la aplicación IIS.
- Administrar sitio web
- Ajustes avanzados
- Configure los protocolos Habilitados para que sean "http, net.tcp"
Segundo:
- En el menú Acciones en el lado derecho del Administrador, haga clic en Enlaces ...
- Haga clic en Agregar
- Cambiar el tipo a "net.tcp"
- Establezca la información de enlace en {número de puerto abierto}: *
- DE ACUERDO