Cela pourrait être dû au fait que le protocole HTTP n'est pas utilisé pour la liaison de fin de service.
j'ai un Service WCF qui fonctionne très bien 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 du Réponse HTTP à http://xx.xx.x.xx:8200/Services/WCFClient.svc . Cela pourrait être dû au service liaison des paramètres N'utilisant pas le protocole HTTP protocole. Cela pourrait également être dû à une Le contexte de la requête HTTP étant interrompu par le serveur (peut-être due à la service de l'arrêt). Voir serveur les journaux 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 retourner une chaîne de caractères à un nom d'image, de sorte que les données transmises ne sont pas beaucoup. J'ai tracé le journal et il me donne la même information. Voici mon config 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>
serait-ce un cadre sur le serveur, car il fonctionne sur ma machine locale?
20 réponses
je pense qu'il y a un problème de sérialisation, vous pouvez trouver l'erreur exacte juste besoin d'Ajouter ci-dessous le code dans la configuration de service dans la section <configuration>
.
après mise à jour de la configuration "App_tracelog.svclog"
le fichier va créer, où votre service existent juste besoin d'ouvrir .svclog
fichier et de trouver la ligne de couleur rouge sur le panneau latéral gauche qui est une erreur et voir sa description pour plus d'informations.
j'espère que cela vous 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>
j'ai eu ce problème: "Cela pourrait être dû au point de terminaison de service de liaison de ne pas utiliser le protocole HTTP", et le service WCF serait arrêté (dans une machine de développement)
j'ai compris: dans mon cas, le problème était à cause D'Énums,
j'ai résolu en utilisant ce
[DataContract]
[Flags]
public enum Fruits
{
[EnumMember]
APPLE = 1,
[EnumMember]
BALL = 2,
[EnumMember]
ORANGE = 3
}
j'ai dû décorer mes Enums avec DataContract, drapeaux et tous chacun des membres d'Enum avec des attributs Enumember.
I résolu après avoir examiné ce référence msdn :
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 le Service Trace Viewer http://msdn.microsoft.com/en-us/library/ms732023.aspx et résolu facilement. Peut-être que cela aidera quelqu'un.
dans mon cas, l'erreur a été générée parce qu'un de mes types complexes avait une propriété sans méthode définie.
le serializer a lancé et exception à cause de ce fait. Ajout de méthodes internes et tout a bien fonctionné.
la meilleure façon de savoir pourquoi cela se produit (à mon avis) est d'activer l'enregistrement des traces.
j'ai réalisé ceci 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 réglé, j'ai couru mon client, j'ai fait exception et vérifié les Traces.svclog fichier. De là, j'avais juste besoin de trouver l'exception.
Solution avec DataContract, les drapeaux pour Enums semble un peu laid. 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
}
j'ai résolu le problème. Il a fini par être un chemin vers mon fichier de configuration était faux. Les erreurs pour WCF sont si utiles parfois.
j'ai vu cette erreur causée par une référence circulaire dans le graphe objet. L'ajout d'un pointeur vers l'objet parent d'un enfant fera boucler le sérialiseur et, en fin de compte, dépassera la taille maximale du message.
j'ai eu ce problème parce que j'ai configuré mon Service WCF pour retourner un système.Données.DataTable.
cela a bien fonctionné dans ma page HTML test, mais a explosé quand je l'ai mis dans mon application Windows Form.
j'ai dû entrer et changer la signature du Contrat opérationnel du Service de datable à DataSet et retourner les données en conséquence.
Si vous avez ce problème, vous pouvez ajouter un autre Contrat Opérationnel de votre Service de sorte que vous n'avez pas à vous soucier de briser le code qui dépendent des Services existants.
cela pourrait être dû à de nombreuses raisons; ci-dessous sont quelques-unes de ceux:
- si vous utilisez des objets de contrat de données complexes (c'est-à-dire des objets personnalisés avec plus d'enfants), assurez-vous que vous avez tous les objets personnalisés décorés avec les attributs DataContract et DataMember
-
si vos objets data contract utilisent l'héritage, assurez-vous que toutes les classes de base possèdent les attributs DataContract et DataMember. Aussi, vous devez avoir les classes de base spécifient les classes dérivées avec [KnownType(typeof(BaseClassType))] attribut ( voir plus d'informations ici sur ce ).
-
assurez-vous que toutes vos propriétés d'objet de contrat de données ont les propriétés get et set.
mon problème était que trop d'éléments étaient transmis entre le client et le serveur. J'ai dû modifier ces paramètres dans le comportement des deux côtés.
<dataContractSerializer maxItemsInObjectGraph="2147483646"/>
Pour plus d'informations sur cette question, voir aussi: une connexion existante a été fermée de force par l'hôte distant - WCF
Mon problème a fini par être 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 vous obtenez ce travail que commencer à ajouter des choses supplémentaires si nécessaire.
mon problème était, ce type de retour de mon service était chaîne. Mais j'ai retourné la chaîne de caractères de type xml:
<reponse><state>1</state><message>Operation was successfull</message</response>
ainsi l'erreur fut jetée.
cette erreur peut être due à une inadéquation du contrat. Examinez les trois couches d'application ci-dessous...
couche UI
/
Couche De Procédé
/
Couche D'Accès Aux Données
- >Contrat entre le processus et la couche UI a le même enum avec absent (Onhold = 3). Enum: Démarrer = 1, Arrêt = 2.
- >Le contrat entre L'accès aux données et la couche de traitement a déjà été signé: Start = 1,Arrêt = 2,Onhold = 3.
dans ce cas, nous obtiendrons la même erreur dans la réponse de la couche process.
la même erreur se retrouve dans d'autres contrats inadéquats dans les applications multicouches.
cela pourrait 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 est l'utilisation d'un type de retour pour un [Operation Contract] qui est soit abstrait, interface, ou non connu du code client WCF.
Vérifier le poteau (et la solution) en dessous de
je pense que la meilleure façon de résoudre cela est de suivre les conseils d'erreur, donc de chercher des journaux de serveur. Pour activer logs 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>
alors vous allez à c:\logs\TracesServ_ce.svclog l'ouvrir avec microsoft visionneuse de trace de service. Et voir ce que le problème est vraiment.
j'ai lutté avec cela pendant quelques jours et essayé chaque réponse de ce post et beaucoup d'autres et de partager ma solution parce que les symptômes étaient les mêmes, mais le problème était différent.
le problème était que le pool de l'application était configuré avec une limite de mémoire et qu'il est simplement recyclé après une période de temps variable.
Espérons que cela aide quelqu'un d'autre!
Salutations,
dans mon cas
mon service a la fonction de download Files
et cette erreur ne s'est manifestée qu'en essayant de télécharger Big Files
donc j'ai trouvé cette réponse pour augmenter maxRequestLength
à la valeur nécessaire dans web.config
je sais que c'est bizarre, mais problème résolu
si vous n'effectuez aucune opération de téléchargement peut-être que cette réponse ne vous aidera pas
avait également ce problème et il était dû à oublier de décorer mon modèle avec DataContract et DataMember attributs
pour moi, les solutions de cette erreur sont très étranges. C'était la question de l'adresse de port de EndpointAddress . Dans Visual studio port adresse de votre fichier (par exemple Service1.svc) et l'adresse du port de votre projet wcf doit être la même que celle que vous donnez dans EndpointAddress . Permettez-moi de vous décrire cette solution en détail.
il y a deux étapes pour vérifier les adresses des ports.
-
Dans votre projet WCF cliquez avec le bouton droit de la souris sur votre fichier de Service (par exemple Service1.svc) - > que sélectionner voir 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 sur votre projet FMC - > que sélectionner propriétés - > aller à la Web Tab - > maintenant dans section des serveurs - > sélectionnez utilisez Visual Studio Development Server - > sélectionnez port spécifique et donnez l'adresse du port que nous avons trouvé précédemment à partir de notre Service1.svc service. C'est (61122) .
plus tôt, 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 ceci pourrait être résolu votre problème.
pour corriger cela, nous avons dû changer L'identité D'AppPool en un compte administrateur .