J'essaye de faire un service de 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 à l'aide de WCFStorm, qui est capable de récupérer toutes les métadonnées correctement, mais lorsque j'appelle la méthode, je reçois:
Le schéma d'URI fourni 'https' n'est pas valide; attendu 'http'. Nom du paramètre: via
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>
En ajoutant ceci comme une réponse, juste parce que 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 en est que la DLL était en cours de téléchargement dans un système, ce qui interdisait l'utilisation de fichiers de configuration.
Voici le code car il devait être mis à jour pour communiquer en 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
Exécutez-vous cela sur le Cassini (vs dev server) 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 dev.
Voici la configuration de la liaison qui a fonctionné pour moi dans le passé. Au lieu de basicHttpBinding
, il utilise wsHttpBinding
. Je ne sais pas si cela vous pose un problème.
<!-- 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.
Changer de
<security mode="None">
à
<security mode="Transport">
dans votre fichier web.config. Ce changement vous permettra d'utiliser https au lieu de http
J'ai eu le même problème 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 réglé 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 élabore, mais je n’ai jamais essayé de l’utiliser pour me connecter à une méthode déjà configurée sur SSL. J'espère que ça aide quelqu'un!
J'ai eu la même exception dans un scénario custom binding
. Quiconque utilise cette approche peut également le vérifier.
J'étais en train d'ajouter la référence de service à partir d'un fichier local WSDL
. 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 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
Je suis passé dans le même problème, voici comment ma solution s'est avérée:
<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.
Si vous le faites par programme et non dans web.config, son:
new WebHttpBinding(WebHttpSecurityMode.Transport)
Il est bon de 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. Nous les utilisons par exemple pour permettre aux ingénieurs sur site de Modifiez les points de terminaison sans toucher aux fichiers "réels".
La première étape consiste à déplacer la section des liaisons de WPF App.Config dans son propre fichier séparé.
La section sur les comportements est configurée pour autoriser http et https (ne semble pas avoir d'incidence sur l'application si les deux sont autorisés)
<serviceMetadata httpsGetEnabled="true" httpGetEnabled="true" />
Et nous déplaçons la section bindings 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" >
À présent, les ingénieurs sur site doivent uniquement modifier le fichier Bindings.Config et le fichier Client.Config où nous stockons l'URL réelle de chaque ordinateur d'extrémité.
De cette façon, nous pouvons modifier le point de terminaison de http à https et inversement pour tester l'application sans avoir à changer de code.
J'espère que cela t'aides.
Pour récapituler la question dans le PO:
Je me connecte [à un service WCF] à l'aide de WCFStorm, qui est capable de récupérer toutes les métadonnées correctement, mais lorsque j'appelle la méthode, je reçois:
Le schéma d'URI fourni 'https' n'est pas valide; attendu 'http'. Nom du paramètre: via
Les didacticiels WCFStorm résolvent ce problème dans tilisation de IIS et de SSL .
Leur solution a fonctionné pour moi:
Pour corriger l'erreur, générez une configuration client correspondant à 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
Editez le fichier app.config pour qu'il puisse être lu par WCFStorm. Veuillez voir Chargement des fichiers du client App.config . Assurez-vous que les attributs de noeud final/@ name et de noeud final/@ contract correspondent aux valeurs de wcfstorm.
Chargez le fichier app.config modifié dans WCFStorm [à l'aide du bouton Configuration du client].
Invoquer la méthode. Cette fois, l'invocation de la méthode n'échouera plus
Le dernier point de l'élément (1) en vigueur signifie supprimer le préfixe de l'espace de nom que VS ajoute à l'attribut du contrat de noeud final, par défaut "ServiceReference1"
<endpoint ... contract="ServiceReference1.ListsService" ... />
ainsi, dans le fichier app.config que vous chargez dans WCFStorm que vous souhaitez pour ListsService:
<endpoint ... contract="ListsService" ... />
J'avais besoin des reliures suivantes pour que le mien fonctionne:
<binding name="SI_PurchaseRequisition_ISBindingSSL">
<security mode="Transport">
<transport clientCredentialType="Basic" proxyCredentialType="None" realm="" />
</security>
</binding>
wsHttpBinding est un problème car Silverlight ne le supporte pas!