configurar .net wcf web-services endpoints

.net - ¿Cómo configurar un solo servicio WCF para tener múltiples puntos finales HTTP y HTTPS?



endpoint web config (5)

Lo que trato de hacer es obtener un Servicio WCF INDIVIDUAL para trabajar en el entorno de desarrollo que es el esquema HTTP y, además, hacer que el MISMO servicio funcione en el entorno de producción que es el esquema HTTPS. Si elimino los dos extremos de Https (los sufijos ''Https''), funciona en el entorno de desarrollo; Del mismo modo, si elimino solo los dos extremos Http, entonces funciona en el entorno de producción. Me gustaría tener los cuatro puntos finales en el web.config, si es posible.

Mis puntos finales se definen a continuación:

<endpoint address="/Web" behaviorConfiguration="AjaxBehavior" binding="wsHttpBinding" bindingConfiguration="web" name="Web" contract="Service" /> <endpoint address="/Custom" binding="customBinding" bindingConfiguration="custom" name="Custom" contract="Service" /> <endpoint address="/WebHttps" behaviorConfiguration="AjaxBehavior" binding="wsHttpBinding" bindingConfiguration="webHttps" name="WebHttps" contract="Service" /> <endpoint address="/CustomHttps" binding="customBinding" bindingConfiguration="customHttps" name="CustomHttps" contract="Service" />

Editado: estoy editando mi pregunta para agregar el error que recibo y las secciones vinculantes (a continuación). Perdón por la nueva duración de la pregunta.

El error es: "No se pudo encontrar una dirección base que coincida con el esquema http del punto final con enlace WebHttpBinding. Los esquemas de direcciones base registrados son [https]".

Además, el sitio de producción está configurado para "Requerir SSL". Eso no puede cambiar

Las configuraciones de enlaces son:

<behaviors> <serviceBehaviors> <behavior name="ServiceBehavior"> <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="true" /> </behavior> </serviceBehaviors> <endpointBehaviors> <behavior name="AjaxBehavior"> <enableWebScript/> </behavior> </endpointBehaviors> </behaviors> <bindings> <customBinding> <binding name="custom"> <textMessageEncoding> <readerQuotas maxDepth="7000000" maxStringContentLength="7000000" maxArrayLength="7000000" maxBytesPerRead="7000000" maxNameTableCharCount="7000000" /> </textMessageEncoding> <httpTransport maxBufferPoolSize="7000000" maxReceivedMessageSize="7000000" maxBufferSize="7000000" /> </binding> <binding name="customHttps"> <textMessageEncoding> <readerQuotas maxDepth="7000000" maxStringContentLength="7000000" maxArrayLength="7000000" maxBytesPerRead="7000000" maxNameTableCharCount="7000000" /> </textMessageEncoding> <httpsTransport maxBufferPoolSize="7000000" maxReceivedMessageSize="7000000" maxBufferSize="7000000" /> </binding> </customBinding> <webHttpBinding> <binding name="web" maxBufferPoolSize="70000000" maxReceivedMessageSize="70000000"> <readerQuotas maxDepth="70000000" maxStringContentLength="70000000" maxArrayLength="70000000" maxBytesPerRead="70000000" maxNameTableCharCount="70000000" /> <security mode="None" /> </binding> <binding name="webHttps" maxBufferPoolSize="70000000" maxReceivedMessageSize="70000000"> <readerQuotas maxDepth="70000000" maxStringContentLength="70000000" maxArrayLength="70000000" maxBytesPerRead="70000000" maxNameTableCharCount="70000000" /> <security mode="Transport" /> </binding> </webHttpBinding> </bindings> <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />

¿Algunas ideas?


Esta es una de las razones por las que puede configurar el enlace desde la configuración: para poder usar diferentes configuraciones en diferentes entornos.

La solución más fácil para usted es usar makecert para crear un certificado de prueba para su entorno de desarrollo y usar HTTPS tanto en la máquina de desarrollo como en la de producción.

Otra solución es crear un paquete de instalación (msi) y dejar que el administrador cambie la configuración del enpoint durante la instalación.

Editar:

Su requisito de tener los 4 puntos finales en ambas máquinas es alcanzable, pero en ese caso su servicio también estará expuesto en HTTP en producción y todos los que tendrán WSDL para el servicio lo sabrán.


Sigue estos pasos-

1) Escriba dos puntos finales para el servicio, uno es para http y otro para https.

<services> <service behaviorConfiguration="MyServiceBehavior" name="JK.MyService"> <endpoint address="" behaviorConfiguration="WebBehavior" binding="webHttpBinding" bindingConfiguration="webBinding" contract="JK.IMyService"> <identity> <dns value="localhost" /> </identity> </endpoint> <endpoint address="" behaviorConfiguration="WebBehavior" binding="webHttpBinding" bindingConfiguration="webBindingHTTPS" contract="JK.IMyService"> <identity> <dns value="localhost" /> </identity> </endpoint> </service> </services>

2) Habilite tanto httpGetEnabled = "True" httpsGetEnabled = "true" en serviceBehaviors.

<behaviors> <serviceBehaviors> <behavior name="MyServiceBehavior"> <serviceMetadata httpGetEnabled="True" httpsGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="true" /> </behavior> </serviceBehaviors> <endpointBehaviors> <behavior name="WebBehavior"> <webHttp/> </behavior> </endpointBehaviors> </behaviors>

3) Escribir dos configuraciones de enlaces para http y https. Para http, brinde modo de seguridad = "None" y para https give mode = "Transport".

<bindings> <webHttpBinding> <binding name="webBinding"> <security mode="None"> <transport clientCredentialType="None" /> </security> </binding> <binding name="webBindingHTTPS"> <security mode="Transport"> <transport clientCredentialType="None" /> </security> </binding> </webHttpBinding> </bindings>

Ver este enlace


Si está utilizando Visual Studio 2010 y la implementación de proyectos de aplicaciones web, puede usar la sintaxis de transformación Web.config para señalar la configuración de enlace del endpoint de su servicio a una configuración de enlace habilitada para https.

Para mí, me di cuenta de que solo tenía que reemplazar dos elementos en el archivo Web.config. El atributo de configuración de enlace del punto final y el httpsGetEnabled de serviceMetadata deben establecerse en verdadero.

Aquí está el Web.config, en su configuración predeterminada (depuración):

<service name="Service" behaviorConfiguration="DefaultBehavior"> <endpoint name="ServiceEndpoint" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding" contract="IService" /> </service> ... <behaviors> <serviceBehaviors> <behavior name="DefaultBehavior"> <serviceMetadata httpGetEnabled="True" /> <serviceDebug includeExceptionDetailInFaults="True" /> </behavior> </serviceBehaviors> </behaviors>

Aquí está el archivo de transformación Web.Release.config

<behaviors> <serviceBehaviors> <behavior> <serviceMetadata httpsGetEnabled="True" xdt:Transform="Replace" /> <serviceDebug includeExceptionDetailInFaults="False" xdt:Transform="SetAttributes(includeExceptionDetailInFaults)"/> </behavior> </serviceBehaviors> </behaviors> <services> <service> <endpoint bindingConfiguration="SecureTransportBinding" xdt:Transform="SetAttributes(bindingConfiguration)"/> </service> </services>

Así es como se ven mis enlaces, pero son bastante estándar. observe los nombres que se usan arriba:

<basicHttpBinding> <binding name="SecureTransportBinding" closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" maxReceivedMessageSize="2147483647"> <security mode="Transport"/> <readerQuotas maxStringContentLength="2147483647" maxArrayLength="2147483647"/> </binding> <binding name="BasicHttpBinding" closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" maxReceivedMessageSize="2147483647"> <security mode="None"/> <readerQuotas maxStringContentLength="2147483647" maxArrayLength="2147483647"/> </binding> </basicHttpBinding>

Aquí hay un enlace para obtener más información sobre las transformaciones de Web.config:

http://msdn.microsoft.com/en-us/library/dd465326(VS.100).aspx


El tiempo de espera de recepción predeterminado es de 10 minutos, por lo que el cliente de WCF se desconectará después de que el tiempo de inactividad exceda esa limitación. ¿Qué puedo hacer si la conexión debe mantenerse activa?

Solución # 1:

El servidor proporciona una operación ficticia para que el cliente la llame con regularidad para que no esté inactiva.

Solución # 2:

Habilite reliableSession y establezca receiveTimeout y inactivityTimeout en "infinito" tanto en el cliente como en el servidor. Al fragmento de configuración le puede gustar lo siguiente:

<system.serviceModel> <bindings> <wsHttpBinding> <binding name="WSHttpBinding" receiveTimeout="infinite"> <reliableSession inactivityTimeout="infinite" enabled="true" /> </binding> </wsHttpBinding> </bindings> <services> ... </services> ... </system.serviceModel>


Hay muchas razones por las que puede obtener el error:

Could not find a base address that matches scheme http for the endpoint with binding WebHttpBinding. Registered base address schemes are [https].

La mayoría de las razones provienen de la configuración de Web.config, pero podría ser de IIS. Tuve los mismos problemas, si defiende Endpoints con enlaces http y https, debe crear enlaces http y https para el sitio web que creó en IIS-> Site-> Bindings; de lo contrario, obtendrá este error.