Le schéma d'URI fourni «https» n'est pas valide; «http» attendu. Nom du paramètre: via

281

J'essaie de créer un service WCF sur basicHttpBinding à utiliser 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 correctement toutes les métadonnées, mais lorsque j'appelle la méthode réelle, j'obtiens:

Le schéma d'URI fourni «https» n'est pas valide; «http» attendu. Nom du paramètre: via

isg
la source
4
En allemand, le message d'erreur indique " Das bereitgestellte URI-Schema" https "ist ungültig; erwartet wurde" http ". Parametername: via ", au cas où quelqu'un googlerait cela.
Uwe Keim

Réponses:

240

Essayez d'ajouter des informations d'identification de message sur votre app.config comme:

<bindings> 
<basicHttpBinding> 
<binding name="defaultBasicHttpBinding"> 
  <security mode="Transport"> 
    <transport clientCredentialType="None" proxyCredentialType="None" realm=""/> 
    <message clientCredentialType="Certificate" algorithmSuite="Default" />
  </security> 
</binding> 
</basicHttpBinding> 
</bindings> 
Jojo Sardez
la source
35
Merci pour cette réponse au PO; J'avais le même problème et le changement du mode de la balise <security> de la valeur par défaut "None" à "Transport" l'a corrigé.
Otis
1
À l'exception du bloc <message>, qui a été rejeté par IIS6 pour une raison quelconque, cela a bien fonctionné.
Chris Chubb
4
copié la même configuration dans mon projet mais ça ne donne rien d'effet. Ai-je oublié quelque chose à ajouter?
1
Merci beaucoup. J'ai essayé plusieurs solutions trouvées en ligne mais aucune n'a fonctionné. Celui-ci était parfait.
aspnetdeveloper
59

Ajouter ceci comme réponse, juste parce que vous ne pouvez pas faire beaucoup de mise en forme de fantaisie dans les commentaires.
J'ai eu le même problème, sauf que je créais et liais mon client de service Web entièrement en code.
La raison en est que la DLL était téléchargée dans un système, ce qui interdisait l'utilisation de fichiers de configuration.

Voici le code car 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
eidylon
la source
Comment avez-vous créé les classes pour votre service Web?
kaiyaq
Ça marche! J'ai eu le même problème dans mon C #. Il suffit de copier-coller et le problème est résolu.
user3417479
@kaiyaq - Je peux toujours me connecter à l'amende de service pour le développement avec toutes les choses standard, 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.
eidylon
BasicHttpBinding est présent via l'utilisation de System.ServiceModel; Futurs lecteurs de FYI.
DLeh
38

Changer de

<security mode="None">

à

<security mode="Transport">

dans votre fichier web.config. Cette modification vous permettra d'utiliser https au lieu de http

Amir Md Amiruzzaman
la source
30

Exécutez-vous cela sur le Cassini (vs serveur de développement) ou sur IIS avec un certificat installé? J'ai eu des problèmes dans le passé pour essayer 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 cela basicHttpBinding, il utilise wsHttpBinding. Je ne sais pas si c'est un problème pour toi.

<!-- 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" />

Assurez-vous également de modifier la configuration du client pour activer la sécurité du transport.

pattersonc
la source
1
IIS 7 local avec certificat auto-signé installé
2010
13
"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.
Luke Puplett
non valide
negiateServiceCredential
20

J'ai eu la même exception dans un custom bindingscénario. Quiconque utilise cette approche peut également le vérifier.

J'étais en train d'ajouter la référence de 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 réel était https; pas http. J'ai donc changé l'elemet httpTransport en tant que httpsTransport. Cela a résolu 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 liaison personnalisée sur http et https
LCJ
la source
19

J'ai eu le même problème EXACT que l'OP. Ma configuration et ma situation étaient identiques. Je l'ai finalement réduit à 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 configuration "Config" (PAS LA "Config Client"). Après avoir cliqué dessus, cliquez sur l'onglet "Sécurité" dans la boîte de dialogue qui apparaît. Assurez-vous que "Type d'authentification" est défini sur "Aucun" (la valeur par défaut est "Authentification Windows"). Presto, ça marche! Je teste toujours mes méthodes dans WCFStorm au fur et à mesure que je les développe, mais je n'ai jamais essayé de l'utiliser pour me connecter à une qui a déjà été configurée sur SSL. J'espère que cela aide quelqu'un!

Randy Staats
la source
J'ai eu exactement le même problème, mais j'ai eu le mauvais mot de passe en utilisant "Authentification par nom d'utilisateur / mot de passe". Il s'avère que si vous changez votre mot de passe, vous devez cliquer sur l'URL du service et sur le bouton "Actualiser" de la barre d'outils pour qu'il le prenne.
Ryan Shillington
12

Ran dans le même problème, voici comment ma solution s'est avérée à la fin:

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

J'ai essentiellement remplacé chaque occurrence de Http par Https. Vous pouvez essayer d'ajouter les deux si vous préférez.

Fat Shogun
la source
5
Il convient de noter que basicHttpsBinding est 4.5 et plus récent.
Jagd
7

Si vous le faites par programme et non dans web.config, c'est:

new WebHttpBinding(WebHttpSecurityMode.Transport)
Terje Solem
la source
Génial. J'ai toujours détesté les fichiers .exe.config et je fais tout par code à la place. Cela a résolu mon problème.
nivs1978
4

Il est bon de se rappeler que les fichiers de configuration peuvent être divisés en fichiers secondaires pour faciliter les modifications de configuration sur différents serveurs (dev / demo / production, etc.), sans avoir à recompiler le code / l'application, etc. Par exemple, nous les utilisons pour permettre aux ingénieurs sur site de apporter des modifications aux points de terminaison sans toucher réellement aux «vrais» fichiers.

La première étape consiste à déplacer la section des liaisons hors de WPF App.Config dans son propre fichier séparé.

La section des comportements est définie pour autoriser à la fois http et https (ne semble pas avoir d'effet sur l'application si les deux sont autorisés)

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

Et nous déplaçons la section des liaisons vers son propre fichier;

 <bindings configSource="Bindings.config" /> 

Dans le fichier bindings.config, nous basculons la sécurité en fonction du protocole

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

Désormais, les ingénieurs sur site n'ont plus qu'à modifier le fichier Bindings.Config et Client.Config où nous stockons l'URL réelle de chaque point de terminaison.

De cette façon, nous pouvons changer le point de terminaison de http en https et vice-versa pour tester l'application sans avoir à changer de code.

J'espère que cela t'aides.

chillfire
la source
2

Pour récapituler la question dans le PO:

Je me connecte [à un service WCF] en utilisant WCFStorm qui est capable de récupérer correctement toutes les métadonnées, mais lorsque j'appelle la méthode réelle, j'obtiens:

Le schéma d'URI fourni «https» n'est pas valide; «http» attendu. Nom du paramètre: via

Les didacticiels WCFStorm résolvent ce problème dans Travailler avec IIS et SSL .

Leur solution a fonctionné pour moi:

  1. Pour corriger l'erreur, générez une configuration client qui correspond à la configuration du service wcf. La façon la plus simple de procéder consiste à utiliser Visual Studio.

    • Ouvrez Visual Studio et ajoutez une référence de service au service. VS générera un fichier app.config qui correspond au service

    • Modifiez le fichier app.config afin qu'il puisse être lu par WCFStorm. Veuillez consulter Chargement des fichiers Client App.config . Assurez-vous que les attributs endpoint / @ name et endpoint / @ contract correspondent aux valeurs de wcfstorm.

  2. Chargez le fichier app.config modifié dans WCFStorm [à l'aide du bouton de barre d'outils de configuration client].

  3. Appelez la méthode. Cette fois, l'invocation de la méthode n'échouera plus

La dernière puce de l'élément (1) signifie en effet de supprimer le préfixe d'espace de noms que VS ajoute à l'attribut de contrat de noeud final, par défaut "ServiceReference1"

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

donc dans le fichier app.config que vous chargez dans WCFStorm que vous voulez pour ListsService:

<endpoint ... contract="ListsService" ... />
JohnC
la source
2

J'avais besoin des fixations suivantes pour que la mienne fonctionne:

        <binding name="SI_PurchaseRequisition_ISBindingSSL">
          <security mode="Transport">
            <transport clientCredentialType="Basic" proxyCredentialType="None" realm="" />
          </security>
        </binding>
Puce
la source
1

wsHttpBinding est un problème car silverlight ne le prend pas en charge!

Jason Henriksen
la source
Pour référence: Windows Phone 7, Windows Phone 8 ou WinRT non plus.
Jon B
J'ai ajouté une réponse pour
silverlight