web-dev-qa-db-fra.com

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

J'ai un service WCF fonctionnant correctement sur mon ordinateur local. Je l'ai mis sur les serveurs et je reçois le message d'erreur suivant:

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 de point de terminaison de service n'utilise pas le protocole HTTP. Cela peut également être dû à un contexte de requête HTTP interrompu par le serveur (probablement 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 cela fonctionne correctement. Tout ce que je fais pour la fonction est de retourner une chaîne en un nom d'image, de sorte que les données transmises ne sont pas très nombreuses. J'ai tracé le journal et il me donne la même information. Voici la configuration de mon 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 la configuration de mon 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>

S'agit-il d'un paramètre sur le serveur puisqu'il fonctionne sur ma machine locale?

80
Matt Schubert

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

1
Matt Schubert

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

Après la mise à jour de la configuration, le fichier "App_tracelog.svclog" Sera créé. Là où votre service existe, il vous suffit d’ouvrir le fichier .svclog Et de trouver une ligne de couleur rouge sur le panneau de gauche qui est une erreur. 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>
90
Rikin Patel

J'ai eu ce problème "Cela peut être dû au fait que la liaison de point de terminaison de service n'utilise pas le protocole HTTP" et que le service WCF s'arrête (dans une machine de développement)

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

J'ai résolu en utilisant cette

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

    }

Je devais décorer mes Enums avec DataContract, Flags et chacun des membres Enum avec les attributs EnumMember.

J'ai résolu ceci après avoir regardé ceci référence msdn :

73
Rajesh

J'ai eu cette même erreur et le problème était la sérialisation. J'ai réussi à trouver le vrai problème à l'aide de Service Trace Viewer http://msdn.Microsoft.com/en-us/library/ms732023.aspx et je l'ai résolu facilement. Cela aidera peut-être quelqu'un.

17
100r

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

Le sérialiseur a jeté une exception à cause de ce fait. Ajout de méthodes de jeu 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 atteint cet objectif 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à, il me suffisait de trouver l'exception.

13
Stuart

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 
}
8
b1n0m

Je faisais face au même problème et résolu avec le code ci-dessous. (si un problème de connectivité TLS existe)

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

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

2
Abdul Azeez

Cela pourrait être dû à plusieurs 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 davantage 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 possèdent les attributs DataContract et DataMember. De plus, vous devez faire en sorte que les classes de base spécifient les classes dérivées avec l'attribut [KnownType (typeof (BaseClassType))]] ( consultez plus d'informations ici ).

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

1
Sujeewa

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

1
Mark Challen

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

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

1
Serj Sagan

J'ai eu ce problème parce que 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.

Je devais 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 d'un code reposant sur des services existants.

1
jp2code

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

<dataContractSerializer maxItemsInObjectGraph="2147483646"/>
1
Rob Sedgwick

Mon problème était, ce 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>

alors erreur a été jetée.

1
joettriscik

Je pense que la meilleure façon de résoudre ce problème est de suivre les conseils d'erreur, et 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, ouvrez c:\logs\TracesServ_ce.svclog avec le visualiseur de trace de service Microsoft. Et voyez quel est le problème.

1
Lomithrani

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

donc j'ai trouvé cette réponse Augmenter maxRequestLength à la valeur requise dans web.config

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

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

0
Basheer AL-MOMANI

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

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

  1. Dans votre projet WCF, cliquez avec le bouton droit de la souris sur votre fichier de service (par exemple, Service1.svc) -> puis sélectionnez Afficher dans le navigateur maintenant dans votre navigateur, vous avez une URL du type http: // localhost: 61122/Service1.svc alors notez maintenant votre adresse de port en tant que 61122

  2. Faites un clic droit sur votre projet wcf -> que sélectionnez Propriétés -> allez dans Onglet Web -> Maintenant dans Section Serveurs -> sélectionnez tiliser le serveur de développement Visual Studio -> sélectionnez Port spécifique et indiquez l'adresse du port que nous avons précédemment trouvée dans notre service Service1.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 indiquée dans EndpointAddress, mon problème a été résolu.

J'espère que cela pourrait résoudre votre problème.

0
Dilip0165

Également eu ce problème et c'était en raison de l'oubli de décorer mon modèle avec les attributs DataContract et DataMember

0
Ian Rathbone

J'ai lutté avec cela pendant quelques jours et j'ai essayé chaque réponse de cet article et beaucoup d'autres et j'ai partagé 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,

0
Gonza Oviedo

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

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

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

0
modeeb

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

Couche UI
|
Couche de processus
|
Couche d'accès aux données
-> Le contrat entre le processus et la couche d'interface utilisateur a le même enum avec manquant (Onhold = 3). Énumération: Début = 1, Arrêt = 2. -> La couche Contrat entre l'accès aux données et le processus est énumérée. Énumération: Début = 1, Arrêt = 2, Onhold = 3.

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

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

0
Abhijit Kumar