wcf .net-3.5

WCF Enlace a HTTPS



.net-3.5 (4)

Está utilizando los enlaces incorrectos para HTTPS.

Hay dos clases de enlace separadas. wsHttpBinding y wsHttpsBinding notan el s. Necesita agregar un wsHttpsBinding para HTTPS bajo enlaces y necesita un nuevo punto final para ese enlace.

Además, el error particular que está viendo generalmente me permite ver si IIS no se ha configurado para https desde esa ubicación.

  • Abra el Administrador de IIS
  • Sitios abiertos
  • Haga clic derecho en el sitio web predeterminado.
  • Editar enlaces
  • Asegúrese de que haya una entrada para https y http.
  • Abra el Administrador de IIS
  • Encuentra tu aplicación (creo que va a ser el sitio web predeterminado).
  • Botón derecho del ratón
  • Administrar sitio web / aplicación
  • Ajustes avanzados
  • Protocolos habilitados
  • http, https

Entiendo que hay muchas publicaciones al respecto, y he revisado todas las que surgieron en mi búsqueda y he implementado todo lo mencionado. Tengo un servicio web WCF que funciona en mi sistema local en HTTP, y funcionó en el servidor en HTTP. Pero el cliente requiere que esto funcione a través de HTTPS. La miríada de publicaciones en este y otros sitios me muestra que esto no es tan sencillo como debería ser, ya que antes de esto, el servicio web ASMX "simplemente funcionaba" y no necesitaba una configuración complicada.

Recibo el siguiente error con mi configuración actual:

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

Aquí está mi código a partir de este momento, después de intentar durante días configurar esto para que funcione en vano:

<system.serviceModel> <!-- --> <serviceHostingEnvironment aspNetCompatibilityEnabled="true" > <baseAddressPrefixFilters> <add prefix="https://mysite.com"/> <add prefix="http://mysite.com"/> </baseAddressPrefixFilters> </serviceHostingEnvironment> <!-- Set up Custom Behaviors --> <behaviors> <endpointBehaviors> </endpointBehaviors> <serviceBehaviors> <behavior name="WebPostService.WebPostServiceBehavior"> <serviceMetadata httpsGetEnabled="true" httpsGetUrl="WebPostServices.svc/mex" /> <serviceDebug includeExceptionDetailInFaults="false" /> </behavior> </serviceBehaviors> </behaviors> <!-- Set up the binding configuration --> <bindings> <wsHttpBinding> <binding name="SOAPBinding" > <security mode="Transport"> </security> </binding> </wsHttpBinding> </bindings> <services> <service behaviorConfiguration="WebPostService.WebPostServiceBehavior" name="WebPostService.WebPostService" > <host> <baseAddresses> <add baseAddress="https://mysite.com/Services/WebPostService.svc"/> </baseAddresses> </host> <endpoint address="" binding="wsHttpBinding" bindingConfiguration="SOAPBinding" contract="WebPostService.IWebPostService" > <identity> <dns value="mysite.com" /> </identity> </endpoint> <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" > </endpoint> </service> </services> </system.serviceModel>

¿Qué estoy haciendo mal y cómo puedo hacer que funcione en HTTPS? Estoy frustrado de que esto no sea tan simple como debería ser. Estuve enterrado en la documentación de WCF en MSDN durante los meses que trabajé en este proyecto, y tengo una buena comprensión de los servicios, puntos finales y enlaces, lo suficiente como para frustrarme aún más que si no tuviera ningún conocimiento.

ACTUALIZACIÓN: Aún estoy trabajando en esto, tuve un error extraño al tratar de poner la URL completa para la dirección mex. Cambié a esto:

address="https://prcwebs.com/Services/WebPostService.svc/mex"

y obtuve el error:

La configuración de seguridad para este servicio requiere autenticación de Windows, pero no está habilitada para la aplicación IIS que aloja este servicio.

No estoy tratando de usar la Autenticación de Windows, la configuración de seguridad no ha cambiado y todavía está configurada para

<modo de seguridad = "Transporte" />

No se pudo encontrar una dirección base que coincida con el esquema https para el punto final con enlace WebHttpBinding. Los esquemas de direcciones base registradas son [http] - no fueron útiles, nada se menciona que ayudaría No se pudo encontrar una dirección base que coincida con el esquema http para el punto final con enlace WSHttpBinding - Estoy usando seguridad de transporte, esto no se aplica. intenté cambiar a diferentes modos de seguridad, aún no pude hacer que el sitio funcionara.


He usado tu configuración exacta en la configuración 3.5 y funciona con el modo de Transport usando clientCredentialType="None" como se menciona a continuación en la respuesta de Luuk. Pero solo para estar seguro, seguí y creé un proyecto de muestra para simular la mayor cantidad posible de su entorno de la información aquí.

Para simular su entorno, configuré mi IIS (7.5) para utilizar el Asp.Net 2.0 Integrated aplicaciones Asp.Net 2.0 Integrated estándar. Agregué 3 enlaces http y 3 enlaces https para simular "solo puede tener una dirección por problema de esquema" y baseAddressPrefixFilters funciona con eso.

Solo hice una búsqueda y reemplazo en mysite.com a localhost . A continuación se muestra el copiar y pegar de la configuración exacta que utilicé para producir la captura de pantalla:

web.config

<?xml version="1.0"?> <configuration> <system.web> <compilation debug="true" /> <authentication mode="None"/> <customErrors mode="Off"/> </system.web> <system.serviceModel> <!-- --> <serviceHostingEnvironment aspNetCompatibilityEnabled="true"> <baseAddressPrefixFilters> <add prefix="https://localhost"/> <add prefix="http://localhost"/> </baseAddressPrefixFilters> </serviceHostingEnvironment> <!-- Set up Custom Behaviors --> <behaviors> <endpointBehaviors/> <serviceBehaviors> <behavior name="WebPostService.WebPostServiceBehavior"> <serviceMetadata httpsGetEnabled="true" httpsGetUrl="WebPostServices.svc/mex"/> <serviceDebug includeExceptionDetailInFaults="false"/> </behavior> </serviceBehaviors> </behaviors> <!-- Set up the binding configuration --> <bindings> <wsHttpBinding> <binding name="SOAPBinding"> <security mode="Transport"> <transport clientCredentialType="None"/> </security> </binding> </wsHttpBinding> </bindings> <services> <service behaviorConfiguration="WebPostService.WebPostServiceBehavior" name="WebPostService.WebPostService"> <host> <baseAddresses> <add baseAddress="https://localhost/Services/WebPostService.svc"/> </baseAddresses> </host> <endpoint address="" binding="wsHttpBinding" bindingConfiguration="SOAPBinding" contract="WebPostService.IWebPostService"> <identity> <dns value="localhost"/> </identity> </endpoint> <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/> </service> </services> </system.serviceModel> </configuration>

Este es el resultado:

Notará que WebPostService.svc aparece dos veces en la url mex completa. httpsGetUrl soltar httpsGetUrl para que sea solo mex lugar de WebPostService.svc/mex (o lo suelte por completo, y aún funciona bien de mi lado)

Si desea discutir esto o lo que podría ser diferente entre nuestro entorno además de la versión de IIS, estoy en la sala de chat de WPF casi todo el día (otras 5-6 horas).


Agregue multipleSiteBindingsEnabled="true" al serviceHostingEnvironment y actualice la seguridad para deshabilitar las credenciales del cliente:

<security mode="Transport"> <transport clientCredentialType="None"></transport> </security>

EDITAR Mi versión de trabajo final en Windows 2003 fue con la siguiente configuración.

<system.serviceModel> <serviceHostingEnvironment aspNetCompatibilityEnabled="false" /> <!-- Set up Custom Behaviors --> <behaviors> <endpointBehaviors> </endpointBehaviors> <serviceBehaviors> <behavior name="WebPostService.WebPostServiceBehavior"> <serviceMetadata httpsGetEnabled="true" httpsGetUrl="WebPostServices.svc/mex" /> <serviceDebug includeExceptionDetailInFaults="false" /> </behavior> </serviceBehaviors> </behaviors> <!-- Set up the binding configuration --> <bindings> <wsHttpBinding> <binding name="SOAPBinding"> <security mode="Transport"> <transport clientCredentialType="None"/> </security> </binding> </wsHttpBinding> </bindings> <services> <service behaviorConfiguration="WebPostService.WebPostServiceBehavior" name="WcfService2.Service1"> <host> <baseAddresses> <add baseAddress="https://localhost/Service/Service1.svc"/> </baseAddresses> </host> <endpoint address="" binding="wsHttpBinding" bindingConfiguration="SOAPBinding" contract="WcfService2.IService1"> <identity> <dns value="localhost" /> </identity> </endpoint> <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"> </endpoint> </service> </services> </system.serviceModel>

Puede acceder al sitio web con https, así que supongo que la parte del certificado de la instalación es correcta. Si tiene algo que quiera comparar con mi configuración, hágamelo saber.


Usé esto y funcionó para mí, tal vez puede ayudarte

Para habilitar Https en enlaces WCF WsHttp, hay algunos pasos simples que se deben cambiar en el archivo web.config.

Esos pasos son:

Habilite la seguridad del nivel de transporte en el archivo web.config del servicio:

En este paso, debe cambiar el modo de seguridad de ninguno a Transporte. El siguiente código muestra cómo puedes hacerlo:

<bindings> <wsHttpBinding> <binding name="TransportSecurity"> <security mode="Transport"> <transport clientCredentialType="None"/> </security> </binding> </wsHttpBinding> </bindings>

Ate el enlace y especifique la configuración de HTTPS

Ahora debe asociar los enlaces, el paso de vistas previas, con los puntos finales. use la etiqueta bindingConfiguration para especificar el nombre de enlace. También debe especificar la dirección donde se aloja el servicio. El siguiente código muestra cómo puedes hacerlo

<service name="WCFWSHttps.Service1" behaviorConfiguration="WCFWSHttps.Service1Behavior"> <!-- Service Endpoints --> <endpoint address=https://localhost/WCFWSHttps/Service1.svc binding="wsHttpBinding" bindingConfiguration="TransportSecurity" contract="WCFWSHttps.IService1"/> <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/> </service>

. también necesita cambiar httpGetEnabled a httpsGetEnabled en el servicioMetaData. El siguiente código muestra cómo puedes hacerlo:

<serviceMetadata httpsGetEnabled="true"/>

Espero que haya ayudado