101 votes

Erreur WCF "Cela pourrait être dû au fait que le certificat du serveur n'est pas configuré correctement avec HTTP.SYS dans le cas de HTTPS"

Je rencontre un problème en utilisant un appel WCF à partir d'un service Windows vers mon service WCF fonctionnant sur mon serveur web. Cet appel fonctionnait depuis plusieurs semaines, puis soudainement a cessé de fonctionner, et n'a pas fonctionné depuis.

L'exception que je reçois est :

Erreur Générale Système System.ServiceModel.CommunicationException : Une erreur s'est produite lors de la requête HTTP

et ensuite il dit :

Cela pourrait être dû au fait que le certificat du serveur n'est pas configuré correctement avec HTTP.SYS dans le cas du HTTPS. Cela pourrait également être causé par un désaccord de liaison de sécurité entre le client et le serveur.

La sécurité que j'utilise des deux côtés est wsHttpBinding, sans aucun type de chiffrement. Et cela utilise juste HTTP - pas HTTPS, donc je ne comprends pas pourquoi il se plaint du HTTPS.

Le reste de la pile d'exceptions internes est :

SystemNet.WebException : La connexion sous-jacente a été fermée : Une erreur inattendue s'est produite lors de l'envoi. ---> System.IO.IOException : Impossible d'écrire des données sur la connexion de transport : Un argument non valide a été fourni. ---> System.Net.Sockets.SocketException : Un argument non valide a été fourni chez System.Net.Sockets.Socket.MultipleSend(BufferOffsetSize[] buffers, SocketFlags socketFlags) chez System.Net.Sockets.NetworkStream.MultipleWrite(BufferOffsetSize[] buffers)

Je dois également noter que le point dans mon programme où ceci se produit est sur la ligne "Execute" de l'appel au service web - c'est-à-dire, dès que j'appelle le service web et lui passe l'objet DataContract encapsulé, tout explose.

Tout ce que ce service fait, c'est recevoir une grande quantité de XML (transmise comme un objet .NET à l'appel du côté client), avec lequel il effectue des traitements. Probablement environ 100-200 ko de XML sont transmis. J'ai augmenté les limites des tailles de données des deux côtés à plus de 6 mégas, mais cela n'a pas semblé aider.

Des idées ?


Quelques informations supplémentaires sur ce problème :

Quand nous dupliquons l'environnement client localement, nous constatons que nous ne pouvons pas télécharger de grandes quantités de XML à moins de faire les changements suivants : 1. Sur le serveur, définir le "maxRequestLength" à 100 Mo (bien plus élevé que ce que nous envoyons) 2. Sur le client, nous définissons la valeur de maxItemsInObjectGraph sous la balise dataContractSerializer à "2147483646".

Avec ces changements, notre installation locale se télécharge avec succès. Cependant, l'installation du client sur leur serveur échoue toujours. Ce qui est intéressant à noter est qu'une fois que nous avons modifié la valeur de maxRequestLength sur le serveur, notre installation de test a commencé à afficher une erreur spécifiquement liée au réglage maxItemsInObjectGraph. Alors que sur le serveur du client, l'erreur originale "HTTP.sys" se produit toujours.

Comme je l'ai mentionné précédemment, nous n'utilisons pas du tout SSL, et il y a 2 autres appels de services web qui exécutent et téléchargent du XML de la même manière. Cependant, étant donné que l'appel de service non fonctionnel transmet plus de données, cela semble être un problème de taille.

Cependant, si le problème rencontré par le client était le même que celui de notre installation de test, je ne comprends pas pourquoi le message d'erreur du client ne serait pas lié à l'erreur de l'ObjectGraph.

Est-il possible que nous recevions simplement l'erreur générique "paramètre non valide" "HTTP.sys" pour chaque erreur possible du client (c'est-à-dire qu'il reçoit vraiment l'erreur de l'ObjectGraph aussi, mais ne l'affiche tout simplement pas ?)

7voto

Shashank Points 71

Changer votre application client en 4.5 et plus. Si vous êtes en 4.5, utilisez : System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12 / Tls1.1 / Tls1.0 selon les besoins ou vous pouvez mettre à jour votre application vers une version supérieure à 4.6.1.

5voto

Sotiris Zegiannis Points 339

Après beaucoup de recherches et avoir prononcé le nom du Seigneur en vain, je l'ai enfin eu. J'ai installé TLS 1.2 sur le serveur où mon service wcf est en cours d'exécution. Mon client était configuré correctement mais il était construit sur .NET 4.5.1 alors que le wcf était sur .NET 4.6.1. Le client et le serveur doivent être à la même version de .NET si vous utilisez TLS 1.2. J'espère que cela aidera quelqu'un un jour :-)

4voto

Dave Markle Points 44637

Avez-vous activé la trace puis utilisé le ServiceTraceViewer pour analyser les journaux? Vous obtenez beaucoup, beaucoup plus d'informations sur ces erreurs générales horribles de cette manière.

4voto

atlas944 Points 31

Nous avons eu pratiquement le même problème récemment et il s'est avéré être causé par la mise à jour de Microsoft KB980436 (http://support.microsoft.com/KB/980436) installée sur l'ordinateur appelant. La solution pour nous, à part la désinstallation pure et simple, a été de suivre les instructions sur le site KB pour définir le DWORD UseScsvForTls dans le registre à 1. Si vous constatez que cette mise à jour est installée sur votre système appelant, vous voudrez peut-être essayer cela.

3voto

user1069816 Points 158

Si votre service WCF utilise le framework .net 4.0 et que quelqu'un a désactivé TLS 1.0 sur le serveur, vous verrez cette exception. En raison du fait que .net 4.0 ne supporte pas les versions plus élevées de TLS.

Protocoles pris en charge : https://msdn.microsoft.com/fr-fr/library/system.security.authentication.sslprotocols(v=vs.100).aspx

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