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?
la source
Réponses:
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.svclog
fichier 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>
la source
System.Runtime.Serialization
source dans ma trace.<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.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 :
la source
J'ai eu cette même erreur et le problème était la sérialisation. J'ai réussi à trouver le vrai problème en utilisant Service Trace Viewer http://msdn.microsoft.com/en-us/library/ms732023.aspx et je l'ai résolu facilement. Peut-être que cela aidera quelqu'un.
la source
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.
la source
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 }
la source
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.
la source
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.
la source
Pour résoudre ce problème, nous avons dû changer l'identité AppPool en un compte administrateur .
la source
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.
la source
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.
la source
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.
la source
Cela peut être dû à de nombreuses raisons; ci-dessous sont quelques-uns de ceux-ci:
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 ).
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.
la source
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"/>
la source
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
la source
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.
la source
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.la source
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,
la source
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.
la source
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
maxRequestLength
valeur 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
la source
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.
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
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.
la source
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
la source
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
la source