Le passage des données à partir d'un ajax de jquery demande à un service wcf échoue désérialisation?
J'utilise le code suivant pour appeler un service wcf. Si je l'appelle un (test) méthode qui ne prend pas de paramètres, mais retourne une chaîne de caractères, il fonctionne très bien. Si j'ajoute un paramètre à ma méthode, j'obtiens une erreur bizarre:
{"ExceptionDetail":{"HelpLink":null,"InnerException":null,"Message":"Le jeton '\"' a été prévu, mais trouvé "'.","StackTrace":" au Système.Xml.XmlExceptionHelper.ThrowXmlException(XmlDictionaryReader lecteur, String res, String arg1, Chaîne arg2, Chaîne arg3)\u000d\u000a au Système.Xml.XmlExceptionHelper.ThrowTokenExpected(XmlDictionaryReader lecteur, Chaîne prévu, Char trouvé)\u000d\u000a au Système.Moment de l'exécution.La sérialisation.Json.XmlJsonReader.ParseStartElement()\u000d\u000a au Système.Moment de l'exécution.La sérialisation.Json.XmlJsonReader.Read()\u000d\u000a au Système.ServiceModel.Répartiteur.DataContractJsonSerializerOperationformatter.DeserializeBodyCore(XmlDictionaryReader lecteur, Object[] paramètres, Boolean isRequest)\u000d\u000a au Système.ServiceModel.Répartiteur.DataContractJsonSerializerOperationformatter.DeserializeBody(XmlDictionaryReader lecteur, MessageVersion version, Chaîne d'action, MessageDescription messageDescription, Object[] paramètres, Boolean isRequest)\u000d\u000a au Système.ServiceModel.Répartiteur.OperationFormatter.DeserializeBodyContents(Message, Object[] paramètres, Boolean isRequest)\u000d\u000a au Système.ServiceModel.Répartiteur.OperationFormatter.DeserializeRequest(Message, Object[] paramètres)\u000d\u000a au Système.ServiceModel.Répartiteur.DemultiplexingDispatchMessageFormatter.DeserializeRequest(Message, Object[] paramètres)\u000d\u000a au Système.ServiceModel.Répartiteur.UriTemplateDispatchFormatter.DeserializeRequest(Message, Object[] paramètres)\u000d\u000a au Système.ServiceModel.Répartiteur.CompositeDispatchFormatter.DeserializeRequest(Message, Object[] paramètres)\u000d\u000a au Système.ServiceModel.Répartiteur.DispatchOperationRuntime.DeserializeInputs(MessageRpc& rpc)\u000d\u000a au Système.ServiceModel.Répartiteur.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)\u000d\u000a au Système.ServiceModel.Répartiteur.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)\u000d\u000a au Système.ServiceModel.Répartiteur.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& rpc)\u000d\u000a au Système.ServiceModel.Répartiteur.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc& rpc)\u000d\u000a au Système.ServiceModel.Répartiteur.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc& rpc)\u000d\u000a au Système.ServiceModel.Répartiteur.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc)\u000d\u000a au Système.ServiceModel.Répartiteur.MessageRpc.Processus(Boolean isOperationContextSet)","Type":"System.Xml.XmlException"},"ExceptionType":"System.Xml.XmlException","Message":"Le jeton '\"' a été prévu, mais trouvé "'.","StackTrace":" au Système.Xml.XmlExceptionHelper.ThrowXmlException(XmlDictionaryReader lecteur, String res, String arg1, Chaîne arg2, Chaîne arg3)\u000d\u000a au Système.Xml.XmlExceptionHelper.ThrowTokenExpected(XmlDictionaryReader lecteur, Chaîne prévu, Char trouvé)\u000d\u000a au Système.Moment de l'exécution.La sérialisation.Json.XmlJsonReader.ParseStartElement()\u000d\u000a au Système.Moment de l'exécution.La sérialisation.Json.XmlJsonReader.Read()\u000d\u000a au Système.ServiceModel.Répartiteur.DataContractJsonSerializerOperationformatter.DeserializeBodyCore(XmlDictionaryReader lecteur, Object[] paramètres, Boolean isRequest)\u000d\u000a au Système.ServiceModel.Répartiteur.DataContractJsonSerializerOperationformatter.DeserializeBody(XmlDictionaryReader lecteur, MessageVersion version, Chaîne d'action, MessageDescription messageDescription, Object[] paramètres, Boolean isRequest)\u000d\u000a au Système.ServiceModel.Répartiteur.OperationFormatter.DeserializeBodyContents(Message, Object[] paramètres, Boolean isRequest)\u000d\u000a au Système.ServiceModel.Répartiteur.OperationFormatter.DeserializeRequest(Message, Object[] paramètres)\u000d\u000a au Système.ServiceModel.Répartiteur.DemultiplexingDispatchMessageFormatter.DeserializeRequest(Message, Object[] paramètres)\u000d\u000a au Système.ServiceModel.Répartiteur.UriTemplateDispatchFormatter.DeserializeRequest(Message, Object[] paramètres)\u000d\u000a au Système.ServiceModel.Répartiteur.CompositeDispatchFormatter.DeserializeRequest(Message, Object[] paramètres)\u000d\u000a au Système.ServiceModel.Répartiteur.DispatchOperationRuntime.DeserializeInputs(MessageRpc& rpc)\u000d\u000a au Système.ServiceModel.Répartiteur.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)\u000d\u000a au Système.ServiceModel.Répartiteur.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)\u000d\u000a au Système.ServiceModel.Répartiteur.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& rpc)\u000d\u000a au Système.ServiceModel.Répartiteur.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc& rpc)\u000d\u000a au Système.ServiceModel.Répartiteur.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc& rpc)\u000d\u000a au Système.ServiceModel.Répartiteur.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc)\u000d\u000a au Système.ServiceModel.Répartiteur.MessageRpc.Processus(Boolean isOperationContextSet)"}
Mon jquery ressemble à ça, mais j'ai essayé de changer les données réelles qui j'envoie une chaîne json sérialisé (comme vous pouvez le voir) à un pur objet json avec le même triste résultat.
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
url: "ajax/Statistics.svc/Get7DaysStatistics",
dataType: "json",
data: "{'customerId': '2'}",
timeout: 10000,
success: function(obj) { updateStatistics(obj.d); },
error: function(xhr) {
if (xhr.responseText)
$("body").html(xhr.responseText);
else
alert('unknown error');
return;
}
});
Le service wcf ressemble à ceci:
[SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic"), OperationContract]
public string Get7DaysStatistics(string customerId)
{
Debug.WriteLine(customerId);
return "Test done";
}
Qu'il est placé dans une classe avec les attributs suivants:
[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
Je ne vais pas lister la configuration dans le web.config pour garder ce long message "court", mais je peux le poster si quelqu'un pense qu'ils peuvent l'utiliser - je veux juste souligner que je PEUX appeler une méthode et d'obtenir un résultat de chaîne ou même un objet json, je peux lire d'aussi longtemps que je NE passe PAS toutes les données pour le service wcf.
Vous devez vous connecter pour publier un commentaire.
D'utiliser des guillemets au lieu de guillemets simples dans le JSON que vous envoyez à ce service. C'est, changer:
à
J'ai testé cette localement et cela résout le problème.
Par ailleurs, j'ai débogué ce à l'aide d'une méthode que j'ai souvent utilisé lors de l'appel de ASMX et des services WCF, en utilisant des bibliothèques autres que dans le haut-ASP.NET outils. J'ai appelé le service en utilisant le proxy client créé par un asp:ScriptReference et ensuite inspecté la requête envoyée au serveur en utilisant un HTTP sniffer (comme HttpFox pour FireFox) et par rapport à la demande de l'un d'être envoyé par jQuery. Ensuite, vous pouvez généralement voir rapidement ce qui est différent (et donc probablement mal) avec la demande. Dans ce cas, il était clair qu'il y a une différence dans le POST de données en cours d'envoi.
Je n'ai jamais pensé que l'affichage est essentiel pour le nom d'utilisateur et le mot de passe journal sur la fonctionnalité, c'est donc la façon dont je l'encoder au format JSon paramètres-je envoyer vers le service web...
Ici est le Webservice de Contrat..
Voici le JQuery (Notez l'utilisation de " et " est important!)
J'ai fait une fonction dans jscript qui a résolu le problème pour l'envoi de données par la POSTE à un service WCF ... suivez le code ...
fonction formatJsonDataToWCFPost(d){
}
Je pense que sur votre exploitation, vous avez besoin de cet attribut:
Voir jQuery AJAX appels à un Service WCF REST pour plus d'info.