298 votes

Le schéma URI fourni, 'https', n'est pas valide ; on attendait 'http'. Nom du paramètre : via

J'essaie de faire un service WCF sur basicHttpBinding pour être utilisé sur https. Voici mon web.config :

<!-- language: xml -->
<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>
...
<behaviors>
  <serviceBehaviors>
    <behavior name="MyServices.UpdateServiceBehavior">
      <serviceMetadata httpsGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>

Je me connecte en utilisant WCFStorm qui est capable de récupérer toutes les méta-données correctement, mais quand j'appelle la méthode réelle, j'obtiens :

Le schéma d'URI fourni 'https' n'est pas valide ; il fallait s'attendre à 'http'. Paramètre nom : via

7 votes

En allemand, le message d'erreur se lit comme suit : " Le schéma URI fourni "https" est invalide ; le schéma attendu était "http". Nom du paramètre : via ", au cas où quelqu'un ferait une recherche sur Google.

254voto

Jojo Sardez Points 4727

Essayez d'ajouter les informations d'identification des messages dans votre app.config, par exemple :

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

36 votes

Merci pour cette réponse à l'OP ; j'avais le même problème et le changement du mode de la balise <security> de la valeur par défaut de "None" à "Transport" l'a réglé.

1 votes

À l'exception du bloc <message>, qui a été rejeté par IIS6 pour une raison quelconque, cela a bien fonctionné.

4 votes

J'ai copié la même configuration dans mon projet mais cela ne donne rien. Ai-je oublié quelque chose à ajouter ?

63voto

eidylon Points 2579

J'ajoute ceci comme réponse, puisque vous ne pouvez pas faire de mise en forme sophistiquée dans les commentaires.
J'avais le même problème, sauf que je créais et liais mon client de service web entièrement en code.
La raison est que la DLL a été téléchargée dans un système qui interdit l'utilisation de fichiers de configuration.

Voici le code tel qu'il devait être mis à jour pour communiquer via 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 votes

Comment avez-vous créé les classes pour votre service web ?

0 votes

Ça marche ! J'avais le même problème dans mon C#. Il suffit de copier-coller et le problème est résolu.

0 votes

@kaiyaq - Je peux toujours me connecter au service pour le développement avec tous les éléments standard, en laissant VS créer les classes pour moi, qui sont ensuite compilées dans la DLL. C'est juste au moment de l'exécution que je ne peux pas télécharger le fichier de configuration avec toutes les informations de connexion.

31voto

pattersonc Points 878

L'exécutez-vous sur Cassini (par rapport au serveur de développement) ou sur IIS avec un certificat installé ? J'ai eu des problèmes dans le passé en essayant de connecter des points de terminaison sécurisés sur le serveur web de développement.

Voici la configuration de liaison qui a fonctionné pour moi dans le passé. Au lieu de basicHttpBinding il utilise wsHttpBinding . Je ne sais pas si c'est un problème pour vous.

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

et le point final

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

Veillez également à modifier la configuration du client pour activer la sécurité du transport.

1 votes

IIS 7 local avec un certificat auto-signé installé

13 votes

"Assurez-vous également de modifier la configuration du client pour activer la sécurité du transport." -- Bon conseil. Trop facilement négligé et WCF ne donnera pas d'indices dans ses erreurs.

0 votes

Non valide negotiateServiceCredential et establishSecurityContext

21voto

Lijo Points 4002

J'ai eu la même exception dans un custom binding scénario. Toute personne qui utilise cette approche peut également le vérifier.

En fait, j'ajoutais la référence du service à partir d'un local WSDL fichier. Il a été ajouté avec succès et la liaison personnalisée requise a été ajoutée au fichier de configuration. Cependant, le service actuel était https et non http. J'ai donc modifié l'élément httpTransport comme suit httpsTransport . Cela a réglé le problème

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

Références

  1. WCF avec custombinding à la fois sur http et https

19voto

Randy Staats Points 331

J'ai eu EXACTEMENT le même problème que le PO. Ma configuration et ma situation étaient identiques. J'ai finalement conclu que c'était un problème dans WCFStorm après avoir créé une référence de service dans un projet de test dans Visual Studio et confirmé que le service fonctionnait. Dans Storm vous devez cliquer sur l'option de paramètres "Config" (PAS LE "Client Config"). Après avoir cliqué sur cette option, cliquez sur l'onglet "Security" dans la boîte de dialogue qui s'affiche. Assurez-vous que le "Type d'authentification" est réglé sur "Aucun" (le défaut est "Authentification Windows"). Et voilà, ça marche ! Je teste toujours mes méthodes dans WCFStorm lorsque je les développe, mais je n'ai jamais essayé de l'utiliser pour me connecter à un site qui a déjà été configuré sur SSL. J'espère que cela aidera quelqu'un !

0 votes

J'ai eu exactement le même problème, mais j'avais le mauvais mot de passe en utilisant "Username/Password Authentication". Il s'avère que si vous changez votre mot de passe, vous devez cliquer sur l'URL du service et sur le bouton "Refresh" de la barre d'outils pour qu'il soit pris en compte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X