2010-03-12 181 views
226

Estoy tratando de hacer que un servicio WCF sobre basicHttpBinding se use sobre https. Aquí está mi web.config:El esquema de URI 'https' proporcionado no es válido; esperado 'http'. Nombre del parámetro: a través de

<service behaviorConfiguration="MyServices.PingResultServiceBehavior" 
    name="MyServices.PingResultService"> 
    <endpoint address="" binding="basicHttpBinding" bindingConfiguration="defaultBasicHttpBinding" 
    contract="MyServices.IPingResultService"> 
     <identity> 
     <dns value="localhost" /> 
     </identity> 
    </endpoint> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    </service> 

...

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

...

estoy usando la conexión WCFStorm que es capaz de recuperar todo el metadatos correctamente, pero cuando llamo al método real, obtengo:

El esquema de URI 'https' proporcionado no es válido; esperado 'http'. Nombre del parámetro: vía

Respuesta

29

¿Está ejecutando esto en el Cassini (contra el servidor de desarrollo) o en IIS con un certificado instalado? He tenido problemas en el pasado tratando de conectar puntos finales seguros en el servidor web de desarrollo.

Aquí está la configuración de encuadernación que me ha funcionado en el pasado. En lugar de basicHttpBinding, usa wsHttpBinding. No sé si eso es un problema para ti.

<!-- Binding settings for HTTPS endpoint --> 
<binding name="WsSecured"> 
    <security mode="Transport"> 
     <transport clientCredentialType="None" /> 
     <message clientCredentialType="None" 
      negotiateServiceCredential="false" 
      establishSecurityContext="false" /> 
    </security> 
</binding> 

y el punto final

<endpoint address="..." binding="wsHttpBinding" 
    bindingConfiguration="WsSecured" contract="IYourContract" /> 

También, asegúrese de cambiar la configuración del cliente para activar la seguridad de transporte.

+1

local IIS 7 con certificado autofirmado instalado – isg

+13

"Además, asegúrese de cambiar la configuración del cliente para habilitar la seguridad del transporte". -- Buen consejo. Demasiado fácilmente pasado por alto y WCF no dará pistas sobre sus errores. –

194

Trate de añadir credenciales de mensajes en la app.config como:

<bindings> 
<basicHttpBinding> 
<binding name="defaultBasicHttpBinding"> 
    <security mode="Transport"> 
    <transport clientCredentialType="None" proxyCredentialType="None" realm=""/> 
    <message clientCredentialType="Certificate" algorithmSuite="Default" /> 
    </security> 
</binding> 
</basicHttpBinding> 
</bindings> 
+25

Gracias por esta respuesta al OP; Estaba teniendo el mismo problema y se corrigió cambiar el modo de la etiqueta del valor predeterminado "Ninguno" a "Transporte". – Otis

+1

Excepto por el bloque , que fue rechazado por IIS6 por alguna razón, funcionó bien. –

+3

copié la misma configuración a mi proyecto pero eso no da ningún efecto. ¿Extrañé algo para agregar? –

1

wsHttpBinding es un problema porque Silverlight no lo soporta!

+0

Como referencia: Windows Phone 7, Windows Phone 8 o WinRT tampoco. –

+0

Agregué una respuesta para silverlight –

19

Tuve el EXACTO mismo problema que el OP. Mi configuración y situación eran idénticas. Finalmente lo reduje a ser un problema en WCFStorm después de crear una referencia de servicio en un proyecto de prueba en Visual Studio y confirmar que el servicio estaba funcionando. En Storm, debe hacer clic en la opción de configuración "Config" (NO EN "Client Config"). Después de hacer clic en eso, haga clic en la pestaña "Seguridad" en el cuadro de diálogo que aparece. Asegúrese de que "Tipo de autenticación" esté configurado en "Ninguno" (El valor predeterminado es "Autenticación de Windows"). Presto, funciona! Siempre pruebo mis métodos en WCFStorm mientras los construyo, pero nunca he intentado usarlos para conectarlos a uno que ya se configuró en SSL. ¡Espero que esto ayude a alguien!

+0

Tuve exactamente el mismo problema, pero tenía una contraseña incorrecta con "Autenticación de nombre de usuario/contraseña". Resulta que si cambia su contraseña, debe hacer clic en la URL del servicio y en el botón "Actualizar" en la barra de herramientas para que la tome. –

13

Tuve la misma excepción en un escenario custom binding. Cualquiera que use este enfoque, puede verificar esto también.

De hecho, estaba agregando la referencia de servicio de un archivo local WSDL. Se agregó con éxito y se agregó el enlace personalizado al archivo de configuración. Sin embargo, el servicio real era https; no http Así que cambié el httpTransport elemet como httpsTransport.Esto solucionó el problema

<system.serviceModel> 
<bindings> 

    <customBinding> 
    <binding name="MyBindingConfig"> 

     <textMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16" 
     messageVersion="Soap11" writeEncoding="utf-8"> 
     <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
      maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
     </textMessageEncoding> 

     <!--Manually changed httpTransport to httpsTransport--> 
     <httpsTransport manualAddressing="false" maxBufferPoolSize="524288" 
     maxReceivedMessageSize="65536" allowCookies="false" authenticationScheme="Anonymous" 
     bypassProxyOnLocal="false" 
     decompressionEnabled="true" hostNameComparisonMode="StrongWildcard" 
     keepAliveEnabled="true" maxBufferSize="65536" 
     proxyAuthenticationScheme="Anonymous" 
     realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false" 
     useDefaultWebProxy="true" /> 
    </binding> 
    </customBinding> 

</bindings> 

<client> 
    <endpoint address="https://mainservices-certint.mycompany.com/Services/HRTest" 
    binding="customBinding" bindingConfiguration="MyBindingConfig" 
    contract="HRTest.TestWebserviceManagerImpl" name="TestWebserviceManagerImpl" /> 
</client> 


</system.serviceModel> 

Referencias

  1. WCF with custombinding on both http and https
+1

gracias señor! Esto era exactamente lo que estaba buscando :) –

2

Para recapitular la pregunta en el PO:

Estoy conectando [a un servicio WCF] usando WCFStorm, que es capaz de recuperar todos los metadatos correctamente, pero cuando llamo al método real, obtengo:

El esquema de URI 'https' proporcionado no es válido; esperado 'http'. Nombre del parámetro: a través de

Los tutoriales WCFStorm abordan este problema en Working with IIS and SSL.

Su solución funcionó para mí:

  1. Para corregir el error, generan una configuración cliente que coincide con la configuración del servicio WCF. La forma más fácil de hacerlo es con Visual Studio.

    • Abra Visual Studio y añada una referencia de servicio al servicio. VS generará un archivo app.config que coincida con el servicio

    • Edite el archivo app.config para que WCFStorm lo pueda leer. Por favor, consulte Loading Client App.config files. Asegúrese de que los atributos endpoint/@ name y endpoint/@ coinciden con los valores en wcfstorm.

  2. Cargar el app.config modificado para WCFStorm [usando el botón de barra de herramientas de Config cliente].

  3. Invoque el método. Esta vez la invocación del método ya no fallará

Artículo (1) última bala en efecto significa que eliminar el prefijo de espacio de nombres que VS antepone al atributo contrato de punto final, por defecto "ServiceReference1"

<endpoint ... contract="ServiceReference1.ListsService" ... /> 

por lo que en el app.config que cargue en WCFStorm que desea para ListsService:

<endpoint ... contract="ListsService" ... /> 
8

se encontró con el mismo problema, así es como mi solución resultó al final:

 <basicHttpsBinding> 
      <binding name="VerificationServicesPasswordBinding"> 
       <security mode="Transport"> 
       </security> 
      </binding> 
      <binding name="VerificationServicesPasswordBinding1" /> 
     </basicHttpsBinding> 

básicamente sustituyen todas las apariciones de HTTP con HTTPS. Puede intentar agregar ambos si lo prefiere.

+3

Debe tenerse en cuenta que basicHttpsBinding es 4.5 y más reciente. – Jagd

40

Agregando esto como una respuesta, ya que no se puede hacer un gran formato en los comentarios.
Tuve el mismo problema, excepto que estaba creando y vinculando a mi cliente de servicios web completamente en código.
Motivo es que el archivo DLL se estaba cargando en un sistema, lo que prohibía el uso de archivos de configuración.

Aquí está el código, ya que necesita ser actualizada para comunicarse a través de SSL ...

Public Function GetWebserviceClient() As WebWorker.workerSoapClient 
    Dim binding = New BasicHttpBinding() 
    binding.Name = "WebWorkerSoap" 
    binding.CloseTimeout = TimeSpan.FromMinutes(1) 
    binding.OpenTimeout = TimeSpan.FromMinutes(1) 
    binding.ReceiveTimeout = TimeSpan.FromMinutes(10) 
    binding.SendTimeout = TimeSpan.FromMinutes(1) 

    '// HERE'S THE IMPORTANT BIT FOR SSL 
    binding.Security.Mode = BasicHttpSecurityMode.Transport 

    Dim endpoint = New EndpointAddress("https://myurl/worker.asmx") 

    Return New WebWorker.workerSoapClient(binding, endpoint) 
End Function 
+0

¿Cómo se crearon las clases para su servicio web? – kaiyaq

3

Es una buena recordar que los archivos de configuración pueden ser divididos en archivos secundarios para hacer más fácil configuración cambia en diferentes servidores (dev/demo/production, etc.), sin tener que volver a compilar código/aplicación, etc. Por ejemplo, los usamos para permitir que los ingenieros en el sitio realicen cambios en el punto final sin tocar realmente los archivos "reales".

El primer paso es mover la sección de enlaces fuera de WPF App.Config en su propio archivo separado.

La sección comportamientos está configurado para permitir HTTP y HTTPS (no parece tener un efecto en la aplicación tanto si están permitidos)

<serviceMetadata httpsGetEnabled="true" httpGetEnabled="true" /> 

y nos movemos los enlaces de la sección a su propio archivo ;

<bindings configSource="Bindings.config" /> 

En el archivo bindings.config cambiamos la seguridad basada en el protocolo

<!-- None = http:// --> 
    <!-- Transport = https:// --> 
    <security mode="None" > 

Ahora el sitio de ingenieros sólo se necesita cambiar el archivo Bindings.Config y la Client.Config donde almacenamos la URL real para cada punto final.

De esta manera podemos cambiar el punto final de http a https y viceversa para probar la aplicación sin tener que cambiar ningún código.

Espero que esto ayude.

19

Cambio de

<security mode="None"> 

a

<security mode="Transport"> 

en su archivo web.config. Este cambio permitirá utilizar https en lugar de http

3

Si hace esto mediante programación y no en su web.config:

new WebHttpBinding(WebHttpSecurityMode.Transport) 
+0

Genial. Siempre odié los archivos .exe.config, y hago todo por código en su lugar. Esto resolvió mi problema. – nivs1978

1

que necesitaba a los siguientes enlaces para obtener la mina para trabajar:

 <binding name="SI_PurchaseRequisition_ISBindingSSL"> 
      <security mode="Transport"> 
      <transport clientCredentialType="Basic" proxyCredentialType="None" realm="" /> 
      </security> 
     </binding> 
Cuestiones relacionadas