2011-01-25 24 views
23

He escrito un servicio web WCF para consumo con una aplicación Silverlight. Inicialmente, el servicio solo requería un enlace HTTP básico. Ahora necesitamos poder implementar el servicio para usar tanto en http como en https. He encontrado algunos ajustes para web.config que me permiten hacer esto de la siguiente manera:Implementación del servicio WCF con enlaces y puntos finales http y https

<system.serviceModel> 
    <behaviors> 
    <endpointBehaviors> 
     <behavior name="SilverlightFaultBehavior"> 
     <silverlightFaults /> 
     </behavior> 
    </endpointBehaviors> 
    <serviceBehaviors> 
     <behavior name="CxtMappingWebService.CxtMappingWebServiceBehavior"> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="True" /> 
     </behavior> 
    </serviceBehaviors> 
    </behaviors> 
    <bindings> 
    <basicHttpBinding> 
     <binding name="SecureHttpBinding"> 
     <security mode="Transport" /> 
     </binding> 
     <binding name="BasicHttpBinding"> 
     <security mode="None" /> 
     </binding> 
    </basicHttpBinding> 
    </bindings> 
    <services> 
    <service name="CxtMappingWebService.CxtMappingWebService" behaviorConfiguration="CxtMappingWebService.CxtMappingWebServiceBehavior"> 
     <endpoint address="" bindingConfiguration="SecureHttpBinding" binding="basicHttpBinding" contract="CxtMappingWebService.ICxtMappingWebService" behaviorConfiguration="SilverlightFaultBehavior" /> 
     <endpoint address="" bindingConfiguration="BasicHttpBinding" binding="basicHttpBinding" contract="CxtMappingWebService.ICxtMappingWebService" behaviorConfiguration="SilverlightFaultBehavior" /> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    </service> 
    </services> 
</system.serviceModel> 

Desafortunadamente, sin embargo, hay un problema con esto.

Este servicio web debe implementarse en cientos de servidores de nuestros clientes, y no todos ellos usarán https. Desplegarlo en un servidor que no tiene un enlace https configurado en IIS hace que falle. ¿Hay alguna manera de tener estos dos enlaces en la web.config por defecto sin que se agote si no hay un enlace https configurado en IIS?

Tenemos una posible solución para este problema, pero en realidad no se adapta bien a nuestros requisitos de implementación.

¿Alguien más ha encontrado algo como esto antes, y cómo lo resolvió?

+0

¿Qué es *** silverlightFaults ***? – Kiquenet

Respuesta

5

La respuesta aceptada en esta página no es de mucha utilidad si no utiliza un instalador. La respuesta correcta radica en una edición posterior por parte del OP, todo lo que uno necesita hacer es vincular los puertos http y https en IIS y luego usar la configuración siguiente.

  <service name="CxtMappingWebService.CxtMappingWebService" behaviorConfiguration="CxtMappingWebService.CxtMappingWebServiceBehavior"> 
       <endpoint address="" bindingConfiguration="SecureHttpBinding" binding="basicHttpBinding" contract="CxtMappingWebService.ICxtMappingWebService" behaviorConfiguration="SilverlightFaultBehavior" /> 
       <endpoint address="" bindingConfiguration="BasicHttpBinding" binding="basicHttpBinding" contract="CxtMappingWebService.ICxtMappingWebService" behaviorConfiguration="SilverlightFaultBehavior" /> 
       <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
      </service> 

¡Eso funcionó bien para mí!

+0

Por qué lo intento, obtengo una excepción de activación de servicio. ... no se puede activar debido a una excepción durante la compilación. El mensaje de excepción es: No se pueden agregar dos elementos con la misma clave a SynchronizedKeyedCollection. ---> System.ArgumentException: No se pueden agregar dos elementos con la misma clave a SynchronizedKeyedCollection –

1

Dos de sus puntos finales tienen el mismo URI. Esto no está permitido en WCF. Debería poder especificar puntos finales con enlaces diferentes, pero los URI deben ser diferentes (es decir, diferente número de puerto o contrato diferente).

+1

Eso es lo que pensé hasta que lo configuré de esta manera solo para ver si funcionaría, y por la razón que sea, tal vez por el hecho de que el enlace https en IIS está configurado para el puerto 443. Lo único que no funciona El trabajo está intentando ejecutarlo en una máquina donde IIS no tiene una configuración de enlace https. – Zannjaminderson

+1

En realidad, puede tener la misma dirección en múltiples puntos finales debido al filtrado de contratos y la distinción entre una dirección de punto final y un listenURI. Consulte [Múltiples puntos finales en una sola reproducción] (http://msdn.microsoft.com/en-us/library/aa395210.aspx) para obtener más información. – BitMask777

+0

Tengo este _bindings_ ('(type: hostname: port)') en IIS: *** http: none hostaname: 49759 ***, *** https: pre.company.es: 443 *** y ** * http: pre.company.es: 80 ***, Y mis ** URI ** _. *** baseaddress ***: _http: // preservador: 49759/vdir1/SilverlightServices/serv.svc_ y _https: //pre.company.es/vdir1/SilverlightServices/serv.svc_ Cuál sería la ** dirección * *? – Kiquenet

4

Esto correrá a cargo del instalador que utilice para implementar el servicio. Debe ser un requisito previo (o al menos dejar una opción en el instalador) para implementar ambos puntos finales o solo el http.

10

Al final, decidimos ir con archivos externos usando el atributo configSource para las secciones de enlaces, comportamientos, y servicios de la web.config, así:

<bindings configSource="bindings.config" /> 
<behaviors configSource="behaviors.config" /> 
<services configSource="services.config" /> 

De esta manera, hacemos uso de ella de forma predeterminada con esos archivos externos configurados para acceso http solamente, y dar instrucciones al cliente (o ayudarlos) sobre cómo editar los archivos externos para configurar el acceso https. Esto también nos permite implementar cambios futuros en el web.config mismo sin sobreescribir los archivos de configuración externos.

+0

¿Has probado alguna solución para el enlace http y https? alguna *.configuraciones para el caso http-https o solo http? – Kiquenet

Cuestiones relacionadas