2010-12-03 42 views
19

Pasé mucho tiempo averiguando cómo configurar mis servicios WCF para que funcionen para https en el entorno de producción.¿Cómo puedo combinar la configuración de los servicios WCF para http y https en un web.config?

Básicamente, lo que necesitaba hacer esto:

<behaviors> 
    <serviceBehaviors> 
    <behavior name="MyServiceBehavior"> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" /> 
<services> 
    <service name="MyNamespace.MyService" behaviorConfiguration="MyServiceBehavior"> 
    <endpoint address="" bindingNamespace="https://secure.mydomain.com" binding="basicHttpBinding" bindingConfiguration="HttpsBinding" contract="MyNamespace.IMyService"/> 
    </service> 
</services> 
<bindings> 
    <basicHttpBinding> 
    <binding name="HttpsBinding"> 
     <security mode="Transport"> 
     <transport clientCredentialType="None"></transport> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 

añadiendo el atributo bindingNamespace al punto final es la última cosa que hace que funcione.

Pero esta configuración no funciona en mi entorno de desarrollo local donde estoy trabajando con http habitual. Así que mi config existe:

<behaviors> 
    <serviceBehaviors> 
    <behavior name="MyServiceBehavior"> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="false" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" /> 
<services> 
    <service name="MyNamespace.MyService" behaviorConfiguration="MyServiceBehavior"> 
    <endpoint address="" binding="basicHttpBinding" contract="MyNamespace.IMyService"/> 
    </service> 
</services> 

Las diferencias aquí son que he establecido el atributo httpsGetEnabled a falso, y me quitaron el bindingConfiguration y bindingNamespace.

El problema es: ¿cómo puedo crear un bloque de configuración que maneje TANTO?

Realmente odio tener que hacer muchas modificaciones especiales a la configuración cada vez que hago un lanzamiento. Sí, sé que podría tener una tarea de creación posterior que cambie automáticamente los valores, pero me gustaría fusionar las configuraciones si es posible.

que hemos probado algo como esto:

<behaviors> 
    <serviceBehaviors> 
    <behavior name="MyServiceBehavior"> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" /> 
<services> 
    <service name="MyNamespace.MyService" behaviorConfiguration="MyServiceBehavior"> 
    <endpoint address="" binding="basicHttpBinding" contract="MyNamespace.IMyService"/> 
    <endpoint address="" bindingNamespace="https://secure.mydomain.com" binding="basicHttpBinding" bindingConfiguration="HttpsBinding" contract="MyNamespace.IMyService"/> 
    </service> 
</services> 
<bindings> 
    <basicHttpBinding> 
    <binding name="HttpsBinding"> 
     <security mode="Transport"> 
     <transport clientCredentialType="None"></transport> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 

que pensé que poner los dos puntos finales le daría dos opciones para buscar la hora de activar el servicio. Sin embargo, esto no funciona. Obtengo este error:

No se pudo encontrar una dirección base que coincida con el esquema https para el punto final con enlace BasicHttpBinding. Los esquemas de direcciones base registradas son [http].

Al mirar alrededor de SO y el resto de Internet, parece que otros han tenido problemas para matar a este dragón.

+0

¿Está alojando su servicio WCF en IIS, o es usted autónomo? –

+0

Se alojan como archivos .svc en una aplicación web ASP.NET. Usando IIS7 en ambos dev y prod. – sohtimsso1970

+0

@ sohtimsso1970: ¿Encontraste una solución para esto? – Learner

Respuesta

11

Bueno, un problema con su configuración combinada es que sus dos puntos finales están en la misma dirección, eso no funcionará.

Si está alojando en IIS, entonces su servidor, directorio virtual y el *.archivo SVC necesita determinará su dirección de base - que va a ser algo así como:

http://yourservername/VirtualDirectory/YourService.svc 

Si usted quiere tener dos puntos finales, al menos uno de ellos tiene que definir una dirección relativa:

<services> 
    <service name="MyNamespace.MyService" 
      behaviorConfiguration="MyServiceBehavior"> 
     <endpoint 
      address="basic" 
      binding="basicHttpBinding" 
      contract="MyNamespace.IMyService"/> 
     <endpoint 
      address="secure" 
      binding="basicHttpBinding" bindingConfiguration="HttpsBinding" 
      contract="MyNamespace.IMyService"/> 
    </service> 
</services> 

en este caso, tendría su punto final HTTP en:

http://yourservername/VirtualDirectory/YourService.svc/basic 

y su seguro HTTPS punto final en:

https://yourservername/VirtualDirectory/YourService.svc/secure 

Además: su punto final seguro utiliza una configuración HttpsBinding - pero te falta una configuración de este tipo de unión - todo lo que tienes es:

<bindings> 
    <basicHttpBinding> 
    <binding name="HttpBinding"> 
     <security mode="None"> 
     <transport clientCredentialType="None"></transport> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 

es necesario agregar la configuración HttpsBinding !!

<bindings> 
    <basicHttpBinding> 
    <binding name="HttpBinding"> 
     <security mode="None"> 
     <transport clientCredentialType="None"></transport> 
     </security> 
    </binding> 
    <binding name="HttpsBinding"> 
     <security mode="Transport"> 
      <transport clientCredentialType="Windows" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
+0

Lo siento por la supervisión, pero en realidad tengo el enlace seguro. Si miras mi configuración superior, la del servidor, tiene HttpsBinding en su lugar. Ese código combinado que publiqué fue curado manualmente por mí al crear la pregunta SO. – sohtimsso1970

+2

Si entiendo cómo funcionan las direcciones de punto final, agregar esas ubicaciones relativas cambiaría el lugar donde se accede a la URL. Quiero usar la misma URL tanto en dev como en prod. Así que no quiero tener que agregar "básico" o "seguro" al final simplemente porque cambié a https. ¿Estás diciendo que no es posible de otra manera? – sohtimsso1970

+3

¿Alguna vez encontró una solución para habilitar HTTP/HTTPS en el mismo punto final? Estoy en la misma situación. En esencia, estoy buscando cambiar el valor de securityMode en la configuración de enlace en función del esquema de solicitud actual en el código – StickyMcGinty

2

El problema no está en el archivo de configuración, sino en la configuración de IIS. Debe habilitar ambos HTTP & HTTPS en IIS. En IIS 7.5, vaya a su sitio y haga clic en Vinculaciones en Editar acción del sitio. Asegúrese de que se hayan agregado ambos http & https. Luego debe crear un enlace para HTTP bajo <basicHttpBinding>, con el modo de seguridad establecido en none. Agregue la configuración de enlace recién creada al punto final http. Eres bueno para ir. Avíseme si necesita más problemas.

+0

Mi problema: _bindings_ ('(type: hostname: port)') en IIS: *** http: none hostaname: 49759 ***, *** https: pre.company.es: 443 *** y * ** http: pre.company.es: 80 ***, Y *** baseaddress ***: _http: // preservador: 49759/vdir1/SilverlightServices/serv.svc_ y _https: //pre.company.es /vdir1/SilverlightServices/serv.svc_ – Kiquenet

Cuestiones relacionadas