Je reçois une erreur en dessous d'une erreur en essayant d'ajouter un service WCF à WCFTestClient. Je suis passé par nombre de solution sur le Web mais je ne pouvais pas le faire fonctionner.
Quelqu'un peut-il m'aider avec les problèmes? Je fournis également mon fichier de configuration pour le service:
Type de contenu application/soap + xml; charset = utf-8 n'était pas supporté par service Les liaisons client et service peuvent ne pas correspondre. Le Le serveur distant a renvoyé une erreur: (415) Impossible de traiter le message parce que le type de contenu 'application/soap + xml; charset = utf-8 'n'était pas le type attendu 'text/xml; jeu de caractères = utf-8
Code:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<compilation debug="true" />
</system.web>
<!-- When deploying the service library project, the content of the config file
must be added to the Host's app.config file. System.Configuration does not
support config files for libraries. -->
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="basicHttp" allowCookies="true"
maxReceivedMessageSize="20000000"
maxBufferSize="20000000"
maxBufferPoolSize="20000000">
<readerQuotas maxDepth="32"
maxArrayLength="200000000"
maxStringContentLength="200000000"/>
</binding>
</basicHttpBinding>
</bindings>
<services>
<service name="WCFTradeLibrary.TradeService">
<endpoint address="" binding="basicHttpBinding"
bindingConfiguration="basicHttp"
contract="WCFTradeLibrary.ITradeService">
</endpoint>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- To avoid disclosing metadata information,
set the value below to false and remove the metadata endpoint
above before deployment -->
<serviceMetadata httpGetEnabled="true"/>
<!-- To receive exception details in faul`enter code here`ts for
debugging purposes,
set the value below to true. Set to false before deployment
to avoid disclosing exception info`enter code here`rmation -->
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
Je rencontre un problème de nommage. Le nom du service doit être exactement le nom de votre implémentation. En cas d'incompatibilité, il utilise par défaut basicHttpBinding
, ce qui donne le type de contenu text/xml
.
Le nom de votre classe est à deux endroits - balisage SVC et fichier CS.
Vérifiez également le contrat du point final - encore une fois, le nom exact de votre interface, rien de plus. J'ai ajouté le nom de l'Assemblée qui ne peut tout simplement pas être là.
<service name="MyNamespace.MyService">
<endpoint address="" binding="wsHttpBinding" contract="MyNamespace.IMyService" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
Voici l'exemple d'un web.config qui résout le problème pour moi. Faites attention au <binding name = "TransportSecurity" messageEncoding = "Text" textEncoding = "utf-8">
J'ai eu le même problème, je l'ai obtenu en "liant" le service avec le comportement du service en procédant comme suit:
A donné un nom au comportement
<serviceBehaviors> <behavior name="YourBehaviourNameHere">
Et en faisant référence à votre comportement à votre service
<services>
<service name="WCFTradeLibrary.TradeService" behaviorConfiguration="YourBehaviourNameHere">
Le tout serait:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<compilation debug="true" />
</system.web>
<!-- When deploying the service library project, the content of the config file must be added to the Host's
app.config file. System.Configuration does not support config files for libraries. -->
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="basicHttp" allowCookies="true"
maxReceivedMessageSize="20000000"
maxBufferSize="20000000"
maxBufferPoolSize="20000000">
<readerQuotas maxDepth="32"
maxArrayLength="200000000"
maxStringContentLength="200000000"/>
</binding>
</basicHttpBinding>
</bindings>
<services>
<service name="WCFTradeLibrary.TradeService" behaviourConfiguration="YourBehaviourNameHere">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttp" contract="WCFTradeLibrary.ITradeService">
</endpoint>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="YourBehaviourNameHere">
<!-- To avoid disclosing metadata information,
set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="true"/>
<!-- To receive exception details in faul`enter code here`ts for debugging purposes,
set the value below to true. Set to false before deployment
to avoid disclosing exception info`enter code here`rmation -->
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
Dans mon cas, l'une des classes n'avait pas de constructeur par défaut - et une classe sans constructeur par défaut ne peut pas être sérialisée.
Comme d'autres l'ont dit, cela se produit en raison de l'inadéquation du service client.
J'ai rencontré le même problème lorsque le débogage a appris qu'il y avait une incompatibilité dans la liaison. Au lieu de WSHTTPBinding, je parlais de BasicHttpBinding. Dans mon cas, je parle aussi bien de BasicHttp que de WsHttp. J'assignais dynamiquement la liaison en fonction de la référence. Vérifiez donc le constructeur de votre service.
Vérifiez votre constructeur de service une fois . Vérifiez l'image ci-dessous
Pour moi, il était très difficile d'identifier le problème en raison du grand nombre de méthodes et de classes impliquées.
Ce que j'ai fait est commenté (supprimé) certaines méthodes de l'interface WebService et essayez, puis commentez un autre groupe de méthodes et essayez, j'ai continué à le faire jusqu'à ce que j'ai trouvé la méthode qui pose problème.
Dans mon cas, il utilisait un objet complexe qui ne peut pas être sérialisé.
Bonne chance!
Mon cas avait une solution différente. Le client utilisait basichttpsbinding [1] et le service utilisait wshttpbinding.
J'ai résolu le problème en modifiant la liaison du serveur à basichttpsbinding . En outre, je devais définir le cadre cible à 4.5 en ajoutant:
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5"/>
</system.web>
[1] la communication était terminée via https.
Cette erreur peut se produire lorsque le client WCF
essaie d'envoyer son message en utilisant MTOM extension (MIME type application/soap+xml
pour transférer SOAP XML in MTOM
), mais que le service est tout à fait en mesure de comprendre les messages normaux SOAP Requête HTTP).
Assurez-vous que vous avez généré votre code client par rapport à la variable WSDL
correcte.
Pour utiliser MTOM côté serveur, modifiez votre fichier de configuration en ajoutant messageEncoding attribut:
<binding name="basicHttp" allowCookies="true"
maxReceivedMessageSize="20000000"
maxBufferSize="20000000"
maxBufferPoolSize="20000000"
messageEncoding="Mtom" >
Mon problème était notre propre classe de collection, qui était marquée avec [DataContract]. De mon point de vue, c’était une approche propre et cela fonctionnait bien avec XmlSerializer, mais pour le point de terminaison WCF, elle cassait et nous devions la supprimer. XmlSerializer fonctionne toujours sans.
Ne fonctionne pas
[DataContract]
public class AttributeCollection : List<KeyValuePairSerializable<string, string>>
Travail
public class AttributeCollection : List<KeyValuePairSerializable<string, string>>
Moi aussi j'ai eu la même erreur dans les journaux de trace. Ma fonction nouvellement créée dans l'API générait la même erreur, mais à ma grande surprise, les anciennes fonctions fonctionnaient bien. Le problème était - Mes membres de données de contrat avaient peu de variables de type objet. soap-xml n'était pas capable de le gérer correctement, cependant, je peux voir que le tableau des types d'objet (objet []) a été passé sans problèmes. Seul un type d'objet simple n'était pas analysé par soap. Cela pourrait être une raison de plus pour laquelle les services jettent l'erreur ci-dessus.
Dans mon cas, la même erreur a été causée par un manque
[DataContract]
...
[DataMember]
attributs dans le type de données retourné.
Vérifiez cela et essayez de les ajouter et voyez si cela vous aide.