2010-06-30 13 views
7

Problemi con il ricevere il mio POST JQuery da accettare dal servizio WCF. Ecco il POST dal javascript:400 Richiesta non valida Risposta HTTP utilizzando un POST WCF tramite JQuery

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

Questo è come mi sto accettando il POST, tramite un interfaccia:

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

e l'implementazione:

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

Quando chiamo il funzione jqueryPost Vedo in Web Inspector una risposta HTTP di 400 Richiesta errata. Non sono sicuro di come far funzionare la richiesta POST.

(Aggiunto il 7/1)
@James, qui è l'uscita dalla finestra di ispezione web:

http://localhost:4252/LoggingTest HTTP Informazioni
metodo di richiesta POST
Codice di stato: 400 Bad Request
intestazioni di richiesta
Accept: /
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, come Gecko) Qt/4.6.2 Safari/532,4
X-richiesta-Con: XMLHttpRequest
Data Form
messaggio: messaggio di prova intestazioni
risposta
Content-Length: 1.165
Content-Type: text/html
Data: giovedì, 1 luglio 2010 18:56:15 GMT
Server: Microsoft-HTTPAPI/1,0

+0

puoi usare Fiddler (o qualcosa di equiv.) E postare la richiesta/risposta completa? Mi chiedo se sta postando su un URL errato (dipende se si sta distribuendo alla radice, per esempio) –

+0

James, ho pubblicato l'output web inspector qui sopra. – ThoughtCrhyme

risposta

2

Allora, ho appena finito per fare questo, Interfaccia:

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

Implementazione:

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; 
     } 
    } 

E ora funziona. Deve avere qualcosa a che fare con i parametri che vengono passati in UriTemplate, perché quando l'ho cambiato per passare i parametri in questo modo:

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

è iniziato ad accettare il POST.

Edit 7/7: Ecco il finale JavaScript anche:

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

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

Mi chiedo, potresti pubblicare il tuo Javascript finale in modo che possiamo vedere la fine della tua soluzione. –

+0

Lo posterò quando tornerò in ufficio martedì, grazie per l'interesse per Mark. – ThoughtCrhyme

+0

È un modo per passare un valore stringa senza uritemplate, nel corpo del post? – enguerran

1

Prova ad aggiungere seguente riga sul contratto di servizio, anche Penso che si dovrebbe usare WrappedRequest invece di Bare

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 

guardare in questo post per ulteriori decorazioni

+0

Ho provato a consentire l'AspNetCompatibilityRequirementsMode nell'implementazione (non è possibile aggiungerlo a un'interfaccia). E ho passato tra richieste Bare e Wrapped. Anche se ho visto online dove questo aiuta molte altre persone ... purtroppo non ho fortuna con quello. – ThoughtCrhyme

+0

Quale configurazione stai usando, puoi incollare qui configuraiton? hai controllato post che ho dato come riferimento? – IBhadelia

+0

Non sto utilizzando IIS quindi non c'è config. – ThoughtCrhyme

1

Potrebbe essere solo una parte del puzzle per farlo funzionare per voi, ma questo mi ha colto fuori per qualche tempo:

Potrebbe essere necessario ricontrollare la sintassi JSON, penso che sia necessario stringere tra virgolette doppie attorno al nome della variabile e della variabile.

ad es.

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

ha bisogno di essere:

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

N.B. doppi apici "messaggio"


EDIT: Grazie per il feedback di seguito, ecco alcuni link che potrebbe rivelarsi utile per la formattazione JSON:

+0

-1: quell'oggetto non è "JSON", è solo un altro oggetto JavaScript. JS è più indulgente riguardo l'analisi e non sono richieste le virgolette. –

+0

Ciao @Matti Virkkunen, Vedo da dove vieni da ...... Sono d'accordo che JavaScript stesso è più "clemente", ma JSON, il formato di scambio di dati (che non richiede JavaScript) è più rigoroso. www.JSON.org suggerisce l'uso di virgolette. Ma ad essere onesti non riesco a trovare un buon link alla bozza di lavoro ECMAScript 5 per informazioni autorevoli ma http://developer.yahoo.com/yui/json/ (Informazioni sul formato JSON) è piuttosto autorevole. Ricorda che la sintassi JSON non è JavaScript per-say (ricorda che JSON può essere usato con javascript) è solo un formato basato su/ispirato a un sottoinsieme di javacript. –

+0

@Matti Virkkunen Detto questo, è vero che puoi probabilmente evitare di usare virgolette doppie per coppie valore/stringa. Gli esempi sulla documentazione di jquery.post non li hanno. E infatti la documentazione di jquery.post non dice nemmeno che devi usare JSON. Ma in entrambi i casi, non penso che meriti un -1, soprattutto perché il C# sul lato server richiede le virgolette. http://stackoverflow.com/questions/4939620/can-wcf-accept-json-encoded-using-single-quotes-and-non-quoted-identifiers Se ho contribuito a chiarire le cose, per favore sentiti libero di migliorare il tuo - 1, se non senza preoccupazioni. –

Problemi correlati