2010-06-30 4 views
7

J'ai du mal à faire accepter mon JQuery POST par le service WCF. Voici le POST du javascript:400 Demande de réponse HTTP incorrecte à l'aide d'un POST WCF via JQuery

function jqueryPost() { 
    var url = "/LoggingTest"; 
    $.post(url, { message: "test message" }); 
} 

Voilà comment je suis d'accepter le POST, via une interface:

[OperationContract] 
[WebInvoke(Method = "POST", 
      UriTemplate = "/LoggingTest", 
      BodyStyle = WebMessageBodyStyle.Bare)] 
void LoggingTest(string message); 

Et la mise en œuvre:

public void LoggingTest(string message) 
{ 
    log.Debug(message, null); 
} 

Quand j'appelle la Fonction jqueryPost Je vois dans l'inspecteur web une réponse HTTP de 400 Bad Request. Vous ne savez pas comment faire fonctionner la requête POST.

(Ajouté le 7/1)
@ James, voici la sortie de l'inspecteur Web:

http://localhost:4252/LoggingTest HTTP Informations
Demande Méthode: POST
Code d'état: 400 Bad Request
têtes de demande
Accepter: /
Cache-Control: max-age = 0
Content-Type: application/x-www-form-urlencoded
Origine: http://localhost:4252
Referer:
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; C -) AppleWebKit/532,4 (KHTML, comme Gecko) Qt/Safari 4.6.2/532,4
X-Requested-Avec: XMLHttpRequest
Formulaire de données
message: message de test
têtes de réponse
Content-Length: 1165
Content-type: text/html
date: Thu, 1 juillet 2010 18:56:15 GMT
serveur: Microsoft-HTTPAPI/1,0

+0

pouvez-vous utiliser Fiddler (ou quelque chose d'équivalent) et afficher la demande/réponse complète? Je me demande si c'est une URL incorrecte (cela dépend de si vous déployez à la racine, par exemple) –

+0

James, j'ai posté la sortie de l'inspecteur web ci-dessus. – ThoughtCrhyme

Répondre

2

Alors, je viens fini par le faire, Interface:

[OperationContract] 
[WebInvoke(Method = "POST", 
      UriTemplate = "LoggingTest/{logID}/{logLevel}?errorCode={errorCodeInt}", 
      BodyStyle = WebMessageBodyStyle.Bare)] 
void LoggingTest(string logID, string logLevel, int errorCodeInt, Stream message); 

Mise en œuvre:

public void LoggingTest(string logID, string logLevel, int errorCodeInt, Stream message) 
    { 
     switch (logLevel) 
     { 
      case "error": 
       log.Error(errorCodeInt, message, null); 
       break; 
      case "warn": 
       log.Warn(errorCodeInt, message, null); 
       break; 
      case "info": 
       log.Info(errorCodeInt, message, null); 
       break; 
      case "debug": 
       log.Debug(errorCodeInt, message, null); 
       break; 
     } 
    } 

Et maintenant cela fonctionne. Doit avoir quelque chose à voir avec les paramètres étant passés dans le UriTemplate, parce que quand je l'ai changé pour passer les paramètres comme ceci:

UriTemplate = "LoggingTest/{logID}/{logLevel}?errorCode={errorCodeInt}", 

il a commencé à accepter le poste.

Modifier 7/7: Voici le JavaScript finale aussi:

jqueryPost('LoggingTest/LogID/debug?errorCode=0', { message: 'this is a test message'} ; 

function jqueryPost(url, message) { 
    $.post(url, message); 
} 
+0

Je me demande, pourriez-vous poster votre Javascript final afin que nous puissions voir la fin à la fin de votre solution. –

+0

Je l'afficherai quand je serai de retour au bureau mardi, merci pour l'intérêt de Mark. – ThoughtCrhyme

+0

Est-ce un moyen de passer une valeur de chaîne sans le uritemplate, dans le corps du message? – enguerran

1

Essayez d'ajouter la ligne suivante sur le contrat de service, également Je pense que vous devriez utiliser WrappedRequest insted de Bare

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 

regard dans ce post pour plus de décorations

+0

J'ai essayé d'autoriser AspNetCompatibilityRequirementsMode dans l'implémentation (vous ne pouvez pas l'ajouter à une interface). Et j'ai basculé entre les demandes Bare et Wrapped. Bien que j'ai vu en ligne où cela aide beaucoup d'autres personnes ... malheureusement pas de chance avec ça. – ThoughtCrhyme

+0

Quelle configuration utilisez-vous, pouvez-vous s'il vous plaît coller la configuration ici? Avez-vous vérifié poste que j'ai donné pour référence? – IBhadelia

+0

Je n'utilise pas IIS donc il n'y a pas de .config – ThoughtCrhyme

1

Il est peut-être qu'une partie du casse-tête pour le faire fonctionner pour vous, mais cela m'a pris pour un certain temps:

Vous devrez peut-être vérifier votre syntaxe JSON, je pense qu'il doit être guillemets doubles autour de la variable et le nom de la variable.

par exemple.

function jqueryPost() { 
    var url = "/LoggingTest"; 
    $.post(url, { message: "test message" }); 
} 

doit être:

function jqueryPost() { 
    var url = "/LoggingTest"; 
    $.post(url, { "message": "test message" }); 
} 

N.B. guillemets doubles "message"


EDIT: Merci pour les commentaires ci-dessous, voici quelques liens qui pourraient se révéler utiles pour le formatage JSON:

+0

-1: Cet objet n'est pas "JSON", c'est juste un autre objet JavaScript. JS est plus indulgent sur l'analyse syntaxique et les guillemets doubles ne sont pas requis. –

+0

Salut @Matti Virkkunen, je vois d'où vous venez ...... Je suis d'accord JavaScript lui-même est plus "indulgent", mais JSON, le format d'échange de données (c'est-à-dire ne nécessitant pas de JavaScript) est plus stricte. www.JSON.org suggère l'utilisation de guillemets doubles. Mais pour être honnête, je ne peux pas trouver un bon lien vers le document de travail ECMAScript 5 pour les informations faisant autorité, mais http://developer.yahoo.com/yui/json/ (A propos du format JSON) est assez autoritaire. Rappelez-vous que la syntaxe JSON n'est pas JavaScript per-say (rappelez-vous que JSON peut être utilisé avec javascript) c'est juste un format basé sur/inspiré par un sous-ensemble de javacript. –

+0

@Matti Virkkunen Ayant dit tout ce qui précède, il est vrai que vous pouvez probablement vous passer de l'utilisation de guillemets doubles pour les paires valeur/chaîne. Les exemples de la documentation de jquery.post ne les ont pas. Et en fait, la documentation de jquery.post ne précise même pas que vous devez utiliser JSON. Mais de toute façon, je ne pense pas qu'il mérite un -1, d'autant plus que le C# sur le serveur nécessite les guillemets doubles. http://stackoverflow.com/questions/4939620/can-wcf-accept-json-encoded-using-single-quotes-and-non-quoted-identifiers Si j'ai aidé à clarifier les choses, n'hésitez pas à amender votre - 1, sinon pas de soucis. –

Questions connexes