2010-09-29 16 views
8

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 sufijo '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.¿Cómo configurar un solo servicio WCF para tener múltiples puntos finales HTTP y HTTPS?

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 añadir el error que estoy recibiendo, y las secciones de unión (abajo). Perdón por la nueva duración de la pregunta.

Error al encontrar "No se pudo encontrar una dirección base que coincida con el esquema http del punto final con enlace WebHttpBinding. Los esquemas de dirección 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" /> 

¿Alguna idea?

+0

¿Has intentado conseguir la solución definitiva? – Kiquenet

Respuesta

0

Esta es una de las razones por las que puede configurar el enlace desde la configuración: para poder usar configuraciones diferentes 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 el 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 será también expuesto en HTTP en la producción y todo el mundo que tendrá WSDL para el servicio estará al tanto de ese.

+0

No puedo usar certificados autofirmados porque necesito usar el servidor de desarrollo VS. Esta es una solución viable, pero sería mi último recurso. En este momento, estoy pensando en usar un ServiceHostFactory y construir dinámicamente todos los enlaces y puntos finales desde una sección de configuración. Estoy frustrado con WCF – Breakskater

+0

. Se siente frustrado porque está utilizando un servidor de desarrollo VS que no es compatible con la mayoría de las funciones de WCF. WCF no es fuente de tu frustración. Las malas herramientas son –

+0

Estoy de acuerdo. Visual Studio Development Server debe ser compatible con HTTPS. Sería un mejor entorno de prueba/depuración si lo hiciera. Estoy principalmente frustrado en VSDS. Solo tendría que tener una configuración para el esquema HTTPS si VSDS lo admite. Breakskater

17

Siga estos pasos-

1) 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) permitir que 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) Escriba 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> 

Marque esta link

+0

Vinay, gracias por su sugerencia. Lo intenté y recibí el error en mi nueva pregunta editada. Publiqué mi configuración de enlace para su revisión. Además, el sitio de producción está configurado para "Requerir SSL". Eso no puede cambiar – Breakskater

+0

Sus puntos finales especifican una dirección relativa para los puntos finales, lo que significa que todos usarán la misma dirección base, que tendrá que especificar http o https. Podría cambiar las direcciones de punto final para que sean absolutas (en lugar de '/ web' hacer que diga 'http:/myurl').com/web 'y eso debería arreglar su error. –

+0

@SteveEllinger Tengo este _bindings_ ('(type: hostname: port)') en IIS: *** http: none hostaname: 49759 ***, *** https: pre.company.es: 443 *** y *** http: pre.company.es: 80 ***, ¿qué pasa con la dirección del punto final? Obtengo 'No se pudo encontrar una dirección base ...' error o '404 no encontrado' para mi svc, según mi _servicemodel configuration_ – Kiquenet

2

Si está utilizando Visual Studio 2010 y Web proyecto de implementación de aplicaciones, puede utilizar la Web.config Transformation Syntax para apuntar 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 defecto (depuración) de configuració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> 

Aquí es lo que mis fijaciones parecen, pero son bastante estándar. cuenta de los nombres que se usan anteriormente:

<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 a más información sobre las transformaciones Web.config:

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

+0

¡Gracias! La transformación de unión vinculante fue justo lo que estaba buscando. –

1

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

Solución # 1:

Server proporciona una operación ficticia para cliente llama con regularidad para que no inactivo.

Solución # 2:

Habilitar reliableSession y establecer ReceiveTimeout y InactivityTimeout a “infinito”, tanto en el cliente y el servidor. El fragmento de configuración puede recibir el siguiente:

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

Hay un montón de 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]. 

mayoría de las razones son de la configuración 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.

Cuestiones relacionadas