example configurar web-config wcf wcf-binding

web-config - configurar - wcf service binding configuration



¿Cómo puedo combinar la configuración de servicios WCF para http y https en un web.config? (3)

Pasé mucho tiempo pensando en cómo configurar mis servicios WCF para que funcionen para https en el entorno de producción.

Básicamente, 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>

Agregar el atributo bindingNamespace al punto final es lo último que lo hizo funcionar.

Pero esta configuración no funciona en mi entorno de desarrollo local donde estoy trabajando bajo http regular. Así que mi configuración hay:

<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 en falso, y eliminé bindingConfiguration y bindingNamespace.

El problema es: ¿cómo creo un bloque de configuración que maneje AMBOS?

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

Probé 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>

Pensé que colocar ambos puntos finales le daría dos opciones para buscar al activar el servicio. Sin embargo, esto no funciona. Me sale este error:

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

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


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 necesario determinarán su dirección básica, será algo como:

http://yourservername/VirtualDirectory/YourService.svc

Si desea tener dos puntos finales, al menos uno de ellos debe 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 punto final HTTPS seguro en:

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

Además: su punto final seguro utiliza una configuración HttpsBinding , pero carece de tal configuración de enlace, todo lo que tiene es:

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

Necesitas agregar la configuración de 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>


El problema no es con el archivo de configuración sino con la configuración de IIS. Debe habilitar tanto HTTP como HTTPS en IIS. En IIS 7.5, vaya a su sitio y haga clic en Enlaces en Editar acción del sitio. Asegúrese de que se hayan agregado http y https. A continuación, debe crear un enlace para HTTP en <basicHttpBinding> , con el modo de seguridad establecido en ninguno. Agregue la configuración de enlace recién creada al punto final de http. Tú eres bueno para irte. Déjame saber si necesitas más problema.


La solución para ejecutar en un dominio local y también ejecutarse en producción y otros entornos, sin depender de la memoria para cambiar nada, son las transformaciones de configuración. Transforman el web.config compilado en función del perfil de configuración seleccionado. Localmente ejecuto el modo Debug , en el entorno de prueba que publish en un perfil TestRelease , y la producción tengo otro perfil:

Si no puede expandir su web.config, puede hacer clic derecho y agregar configuraciones de configuración. Para obtener más que Debug y Release, agregue más configuraciones a través del administrador:

Aquí hay transformaciones de ejemplo:

Web.Debug.config

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> <!--...--> <system.serviceModel> <protocolMapping> <add binding="basicHttpBinding" scheme="http" xdt:Transform="SetAttributes" /> </protocolMapping> <bindings> <basicHttpBinding> <binding xdt:Locator="Match(name)" name="basicHttpBindingConfiguration"> <security xdt:Transform="Remove"> <transport xdt:Transform="Remove"/> </security> </binding> <binding xdt:Locator="Match(name)" name="fileTransferBinding"> <security xdt:Transform="Remove"> <transport xdt:Transform="Remove"/> </security> </binding> </basicHttpBinding> </bindings> </system.serviceModel> </configuration>

Web.Release.config

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> <!--...--> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior> <serviceMetadata httpGetEnabled="false" httpsGetEnabled="false" xdt:Transform="Replace"/> <serviceDebug includeExceptionDetailInFaults="false" xdt:Transform="Replace"/> </behavior> </serviceBehaviors> </behaviors> <protocolMapping> <add binding="basicHttpsBinding" scheme="https" xdt:Transform="Replace"/> </protocolMapping> <bindings> <basicHttpBinding> <binding xdt:Locator="Match(name)" name="basicHttpBindingConfiguration"> <security mode="Transport" xdt:Transform="Insert"> <transport clientCredentialType="None" proxyCredentialType="None" /> </security> </binding> <binding xdt:Locator="Match(name)" name="fileTransferBinding"> <security mode="Transport" xdt:Transform="Insert"> <transport clientCredentialType="None" proxyCredentialType="None" /> </security> </binding> </basicHttpBinding> </bindings> </system.serviceModel> <system.webServer> <directoryBrowse enabled="false" xdt:Transform="Replace"/> </system.webServer> </configuration>