Cela peut être dû au fait que la liaison du point de terminaison du service n'utilise pas le protocole HTTP

87

J'ai un service WCF qui fonctionne correctement sur ma machine locale. Je l'ai mis sur les serveurs et je reçois l'erreur suivante:

Une erreur s'est produite lors de la réception de la réponse HTTP à http: //xx.xx.x.xx: 8200 / Services / WCFClient.svc . Cela peut être dû au fait que la liaison du point de terminaison du service n'utilise pas le protocole HTTP. Cela peut également être dû à un contexte de requête HTTP abandonné par le serveur (éventuellement en raison de l'arrêt du service). Voir les journaux du serveur pour plus de détails.]

Je suis allé au service dans l'url et il fonctionne correctement. Tout ce que je fais pour la fonction est de renvoyer une chaîne à un nom d'image, donc les données transmises ne sont pas beaucoup. J'ai tracé le journal et il me donne les mêmes informations. Voici ma configuration client:

<binding name="basicHttpBinding_IWCFClient" closeTimeout="00:01:00"
         openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
         bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
         maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
         messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
         allowCookies="false">
    <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" 
                  maxArrayLength="2147483647" maxBytesPerRead="2147483647" 
                  maxNameTableCharCount="2147483647" />
    <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
    </security>
</binding>
<endpoint name="basicHttpBinding_IWCFClient" 
    address="http://localhost:4295/Services/WCFClient.svc"
    binding="basicHttpBinding" 
    bindingConfiguration="basicHttpBinding_IWCFClient" 
    behaviorConfiguration="WCFGraphicManagementTool.Services.ClientBehavior"
    contract="WCFClient.IWCFClient" />

Voici ma configuration de serveur:

<service behaviorConfiguration="WCFGraphicManagementTool.Services.WCFClientBehavior"
    name="WCFGraphicManagementTool.Services.WCFClient">
   <endpoint name="basicHttpBinding_IWCFClient"
       address="" 
       binding="basicHttpBinding" 
       contract="WCFGraphicManagementTool.Contracts.IWCFClient" />
   <endpoint 
       address="mex" 
       binding="mexHttpBinding" 
       contract="IMetadataExchange" />
</service>
<behavior name="WCFGraphicManagementTool.Services.WCFClientBehavior">
   <dataContractSerializer maxItemsInObjectGraph="2147483647" />
   <serviceThrottling maxConcurrentCalls="120" maxConcurrentSessions="120"
                      maxConcurrentInstances="120" />
   <serviceMetadata httpGetEnabled="true" />
   <serviceDebug includeExceptionDetailInFaults="true" />
</behavior>

Serait-ce un paramètre sur le serveur puisqu'il fonctionne sur ma machine locale?

Matt Schubert
la source
J'ai résolu mon problème comme je l'ai expliqué ici: stackoverflow.com/questions/5537794/…
Adi
On dirait que tu es allé plus loin que moi. Peut-être pourriez-vous me donner une indication sur la marche à suivre. stackoverflow.com/questions/16628382/…
Niels Brinch
Avez-vous une chance d'accepter l'une des réponses, car je doute que vous attendiez toujours d'en obtenir une? :)
Noctis

Réponses:

100

Je pense qu'il y a un problème de sérialisation, vous pouvez trouver une erreur exacte, il suffit d'ajouter le code ci-dessous dans la configuration du service dans la <configuration>section.

Après la "App_tracelog.svclog"création du fichier de mise à jour de la configuration , où votre service existe, il suffit d'ouvrir le .svclogfichier et de trouver la ligne de couleur rouge sur le panneau de gauche qui est une erreur et de voir sa description pour plus d'informations.

j'espère que cela aidera à trouver votre erreur.

<system.diagnostics>
    <sources>
      <source name="System.ServiceModel.MessageLogging" switchValue="Warning, ActivityTracing">
        <listeners>
          <add name="ServiceModelTraceListener" />
        </listeners>
      </source>
      <source name="System.ServiceModel" switchValue="Verbose,ActivityTracing">
        <listeners>
          <add name="ServiceModelTraceListener" />
        </listeners>
      </source>
      <source name="System.Runtime.Serialization" switchValue="Verbose,ActivityTracing">
        <listeners>
          <add name="ServiceModelTraceListener" />
        </listeners>
      </source>
    </sources>
    <sharedListeners>
      <add initializeData="App_tracelog.svclog" type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="ServiceModelTraceListener" traceOutputOptions="Timestamp" />
    </sharedListeners>
  </system.diagnostics>
Rikin Patel
la source
4
Cela m'a sauvé la journée en fait. C'était en effet un problème de sérialisation, et il me manquait la System.Runtime.Serializationsource dans ma trace.
julealgon
Nice ... n'était pas au courant :)
Noctis
épique! qui écrit l'erreur, qui n'a été disponible dans aucune exception, dans le fichier App_tracelog.svclog
fubo
Brillant! Merci
SyntaxError
1
Assurez-vous de coller la <system.diagnostics>section à la fin du fichier, juste au-dessus </configuration>. Si vous le collez en haut, vous pourriez obtenir une erreur de type de contenu lors de l'exécution de votre application.
Tawab Wakil
75

J'ai eu ce problème "Cela pourrait être dû à la liaison du point de terminaison du service n'utilisant pas le protocole HTTP" et le service WCF s'arrêterait (dans une machine de développement)

J'ai compris: dans mon cas, le problème était dû à Enums,

J'ai résolu en utilisant ceci

    [DataContract]
    [Flags]
    public enum Fruits
    {
        [EnumMember]
        APPLE = 1,
        [EnumMember]
        BALL = 2,
        [EnumMember]
        ORANGE = 3 

    }

J'ai dû décorer mes Enums avec DataContract, Flags et tous les membres enum avec des attributs EnumMember.

J'ai résolu ce problème après avoir consulté cette référence msdn :

Rajesh
la source
1
Merci. C'était exactement ce que je devais faire aussi.
Matthew Cole
1
Merci, vous venez de me faire gagner beaucoup de temps
nixon
4
Merci beaucoup. J'ai beaucoup économisé mon temps
amesh
Lié à ceci - si vous avez un type enum sur un contrat qui n'est pas le type d'un DataMember, vous obtiendrez cette erreur. J'ai simplement ajouté une propriété qui était un DataMember et lui ai donné le type d'énumération non DataContract.
paz
N'est-il pas également vrai que les énumérations doivent commencer par l'index 0? C'était certainement un problème dans le passé pour moi. Donc dans l'exemple ci-dessus APPLE = 0 au lieu de 1.
The Senator
14

Dans mon cas, l'erreur a été générée car l'un de mes types complexes avait une propriété sans méthode définie.

Le sérialiseur a lancé une exception à cause de ce fait. Ajout de méthodes de set internes et tout a bien fonctionné.

Le meilleur moyen de savoir pourquoi cela se produit (à mon avis) est d'activer la journalisation des traces.

J'ai réalisé cela en ajoutant la section suivante à mon web.config:

<system.diagnostics>
  <sources>
    <source name="System.ServiceModel.MessageLogging" switchValue="Warning,ActivityTracing">
      <listeners>
        <add name="traceListener"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData= "c:\log\Traces.svclog" />
        <add type="System.Diagnostics.DefaultTraceListener" name="Default" />
      </listeners>
    </source>
    <source propagateActivity="true" name="System.ServiceModel" switchValue="Verbose,ActivityTracing">
      <listeners>
        <add name="traceListener"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData= "c:\log\Traces.svclog" />
        <add type="System.Diagnostics.DefaultTraceListener" name="Default" />
      </listeners>
    </source>
  </sources>
  <trace autoflush="true" />
</system.diagnostics>

Une fois défini, j'ai exécuté mon client, obtenu une exception et vérifié le fichier «Traces.svclog». À partir de là, je n'avais plus qu'à trouver l'exception.

Stuart
la source
autoflush = true était la clé
Jeremy Smith
9

Solution avec DataContract, Flags for Enums semble un peu moche. Dans mon cas, le problème a été résolu en ajoutant quelque chose comme "NotSet = 0" dans enum:

public enum Fruits
{
  UNKNOWN = 0,
  APPLE = 1,
  BALL = 2,
  ORANGE = 3 
}
b1n0m
la source
Ah oui, désolé, je viens de commenter une réponse plus avancée. J'ai vu ce comportement aussi.
The Senator
explication: j'ai eu le même problème. La réponse de @ Rikin m'a conduit à: "Le message InnerException était 'Enum value' 0 'n'est pas valide pour le type ..." de [ social.msdn.microsoft.com/Forums/vstudio/en-US / ... J'ai obtenu le jem: "Le problème ici est que vous n'initialisez pas la ..Response et qu'elle prend la valeur par défaut (et invalide) de '0' ... donc elle ne peut pas être sérialisée".
AJ AJ
3

J'étais confronté au même problème et résolu avec le code ci-dessous. (en cas de problème de connectivité TLS)

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

Veuillez coller cette ligne avant d'ouvrir le canal client.

Abdul Azeez
la source
1

J'ai compris le problème. Cela a fini par être un chemin vers mon fichier de configuration était faux. Les erreurs pour WCF sont parfois très utiles.

Matt Schubert
la source
1

Pour résoudre ce problème, nous avons dû changer l'identité AppPool en un compte administrateur .

SarjanWebDev
la source
Cela m'a été utile. Je n'ai pas fait exactement ce que Sarjan a suggéré, mais j'ai simplement donné des droits de lecture / écriture sur le dossier de l'application (sous wwwroot ...) à l'identité du pool d'applications que j'utilisais.
Francesco B.28
1

J'ai vu cette erreur causée par une référence circulaire dans le graphique d'objets. L'inclusion d'un pointeur vers l'objet parent à partir d'un enfant entraînera la boucle du sérialiseur et dépassera finalement la taille maximale du message.

Mark Challen
la source
1

Cette erreur peut être due à une incompatibilité de contrat. Considérez l'application en trois couches ci-dessous ...

Couche UI
|
Couche de processus
|
Couche d'accès aux données
-> Contrat entre la couche de processus et d'interface utilisateur a la même énumération avec manquant (Onhold = 3). Enum: Start = 1, Stop = 2. -> Le contrat entre l'accès aux données et la couche de processus a enum Enum: Start = 1, Stop = 2, Onhold = 3.

Dans ce cas, nous obtiendrons la même erreur dans la réponse de la couche de processus.

La même erreur survient dans d'autres incompatibilités de contrat dans une application multicouche.

Abhijit Kumar
la source
Votre réponse ne semble rien avoir à voir avec la question. Notez également que l'OP a déjà résolu son problème - le chemin d'accès au fichier de configuration était incorrect .
Simon MᶜKenzie
1

J'ai eu ce problème car j'ai configuré mon service WCF pour renvoyer un System.Data.DataTable.

Cela a bien fonctionné dans ma page HTML de test, mais a explosé lorsque j'ai mis cela dans mon application Windows Form.

J'ai dû entrer et modifier la signature du contrat opérationnel du service de DataTable à DataSet et renvoyer les données en conséquence.

Si vous rencontrez ce problème, vous souhaiterez peut-être ajouter un contrat opérationnel supplémentaire à votre service afin de ne pas avoir à vous soucier de la rupture du code qui repose sur les services existants.

jp2code
la source
1

Cela peut être dû à de nombreuses raisons; ci-dessous sont quelques-uns de ceux-ci:

  1. Si vous utilisez des objets de contrat de données complexes (c'est-à-dire un objet personnalisé avec plus d'objets personnalisés enfants), assurez-vous que tous les objets personnalisés sont décorés avec les attributs DataContract et DataMember
  2. Si vos objets de contrat de données utilisent l'héritage, assurez-vous que toutes les classes de base ont les attributs DataContract et DataMember. De plus, vous devez demander aux classes de base de spécifier les classes dérivées avec l'attribut [KnownType (typeof (BaseClassType))] ( consultez plus d'informations ici à ce sujet ).

  3. Assurez-vous que toutes les propriétés d'objet de contrat de données ont à la fois des propriétés get et set.

Sujeewa
la source
1

Mon problème était que trop d'éléments étaient passés entre le client et le serveur. J'ai dû modifier ces paramètres dans le comportement des deux côtés.

<dataContractSerializer maxItemsInObjectGraph="2147483646"/>
Rob Sedgwick
la source
J'ai utilisé la même solution. Mais j'ai dû utiliser Service Trace Viewer comme suggéré par @ 100r pour voir que c'était l'erreur.
Björn
1

Cela peut ne pas être pertinent pour votre problème spécifique, mais le message d'erreur que vous avez mentionné a de nombreuses causes, l'une d'elles utilise un type de retour pour un [OperationContract] qui est abstrait, interface ou inconnu du code client WCF.

Vérifiez le message (et la solution) ci-dessous

https://stackoverflow.com/a/5310951/74138

modeeb
la source
1

Je pense que la meilleure façon de résoudre ce problème est de suivre les conseils d'erreur, donc de rechercher les journaux du serveur. Pour activer les journaux, j'ai ajouté

 <system.diagnostics>
    <sources>
      <source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true">
        <listeners>
          <add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData="c:\logs\TracesServ_ce.svclog" />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>

Ensuite, vous allez dans c: \ logs \ TracesServ_ce.svclog, ouvrez-le avec la visionneuse de trace de service Microsoft. Et voyez quel est vraiment le problème.

Lomithrani
la source
1

Pour plus d'informations sur ce problème, consultez également: Une connexion existante a été fermée de force par l'hôte distant - WCF

Mon problème a finalement été que mes objets de transfert de données étaient trop complexes. Commencez avec des propriétés simples comme public long Id { get; set; }et une fois que cela fonctionne, commencez à ajouter des éléments supplémentaires si nécessaire.

Serj Sagan
la source
1

J'ai lutté avec cela pendant quelques jours et j'ai essayé toutes les réponses de ce post et de bien d'autres et je partage ma solution car les symptômes étaient les mêmes mais le problème était différent.

Le problème était que le pool d'applications était configuré avec une limite de mémoire et qu'il était simplement recyclé après une période de temps variable.

J'espère que cela aide quelqu'un d'autre!
Salutations,

Gonza Oviedo
la source
1

Mon problème était que le type de retour de mon service était une chaîne. Mais j'ai renvoyé une chaîne de type xml:

<reponse><state>1</state><message>Operation was successfull</message</response>

donc une erreur a été lancée.

Joettriscik
la source
1

dans mon cas

mon service a pour fonction de download Files

et cette erreur n'apparaît qu'en essayant de télécharger Big Files

j'ai donc trouvé cette réponse pour augmenter la maxRequestLengthvaleur nécessaire dansweb.config

Je sais que c'est bizarre, mais le problème est résolu

si vous n'effectuez aucune opération de téléchargement ou de téléchargement, cette réponse ne vous aidera peut-être pas

Basheer AL-MOMANI
la source
1

Pour moi, les solutions de cette erreur très étrange. C'était la question de l'adresse de port d' EndpointAddress . Dans Visual Studio, l'adresse du port de votre fichier (par exemple, Service1.svc) et l'adresse du port de votre projet wcf doivent être les mêmes que celles que vous donnez dans EndpointAddress . Laissez-moi vous décrire cette solution en détail.

Il y a deux étapes pour vérifier les adresses de port.

  1. Dans votre projet WCF, faites un clic droit sur votre fichier de service (par exemple, Service1.svc) -> puis sélectionnez Afficher dans le navigateur maintenant dans votre navigateur, vous avez une URL comme http: // localhost: 61122 / Service1.svc, alors notez maintenant votre adresse de port comme un 61122

  2. Cliquez avec le bouton droit sur votre projet wcf -> puis sélectionnez Propriétés -> accédez à l' onglet Web -> Maintenant dans la section Serveurs -> sélectionnez Utiliser le serveur de développement Visual Studio -> sélectionnez Port spécifique et donnez l'adresse de port que nous avons précédemment trouvée dans notre Service1. service svc. C'est (61122) .

Auparavant, j'ai une adresse de port différente. Après avoir spécifié correctement l'adresse du port que j'ai donnée dans EndpointAddress , mon problème a été résolu.

J'espère que cela pourrait être résolu votre problème.

Dilip0165
la source
0

J'ai également eu ce problème et c'était dû à l'oubli de décorer mon modèle avec les attributs DataContract et DataMember

Ian Rathbone
la source
0

Si vous avez une base de données (travaillant dans Visual Studio), assurez-vous qu'il n'y a pas de clés étrangères dans les tables, j'avais des clés étrangères et cela m'a donné cette erreur et quand je les ai supprimées, cela s'est déroulé sans problème

Laaiqah Seedat
la source