2010-06-30 9 views
7

Tengo problemas para que mi JQuery POST sea aceptada por el Servicio WCF. Aquí está el post de la javascript:400 Bad Request HTTP Response utilizando un WCF POST a través de JQuery

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

Esta es la forma en que estoy aceptando el cargo, a través de una interfaz:

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

Y la aplicación:

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

Cuando llamo a la función jqueryPost Veo en el inspector web una respuesta HTTP de 400 Bad Request. No estoy seguro de cómo hacer que la solicitud POST funcione.

(Añadido el 7/1)
@ James, aquí está la salida del inspector web:

http://localhost:4252/LoggingTest HTTP información
Solicitud Método: Enviar
Código de estado: 400 Bad Request
Solicitar Headers
Accept: /
Cache-control: max-edad = 0
Content-Type: application/x-www-form-urlencoded
Origen: http://localhost:4252
Referer:
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; C -) AppleWebKit/532.4 (KHTML, like Gecko) Qt/4.6.2 Safari/532.4
solicitada-X-Con: XMLHttpRequest
formulario de datos
mensaje: prueba cabeceras de los mensajes de respuesta

Content-Length: 1165
Content-Type: text/html
Fecha: Jue, 01 de Jul 2010 18:56:15 GMT
servidor: Microsoft-HTTPAPI/1,0

+0

¿Puedes usar Fiddler (o algo equivalente) y publicar la solicitud/respuesta completa? Me pregunto si se está publicando en una URL incorrecta (depende de si está implementando en la raíz, por ejemplo) –

+0

James, he publicado la salida del inspector web anterior. – ThoughtCrhyme

Respuesta

2

lo tanto, sólo terminó haciendo esto, la interfaz:

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

Implementación:

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

Y ahora funciona. Debe tener algo que ver con los parámetros que se pasan en el UriTemplate, porque cuando lo cambié a pasar los parámetros de este modo:

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

Comenzó aceptar el puesto.

Editar 7/7: Aquí está la última JavaScript también:

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

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

Me pregunto, podría publicar su Javascript final para que podamos ver el final de su solución. –

+0

Lo publicaré cuando regrese a la oficina el martes, gracias por el interés de Mark. – ThoughtCrhyme

+0

¿Es esta una forma de pasar un valor de cadena sin el uritemplate, dentro del cuerpo del post? – enguerran

1

Trate de añadir la línea siguiente en el contrato de servicio, también Creo que se debe utilizar WrappedRequest insted de Bare

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 

mirada en este post para más decoraciones

+0

He intentado permitir AspNetCompatibilityRequirementsMode en la implementación (no puede agregarlo a una interfaz). Y cambié entre las solicitudes Bare y Wrapped. Aunque lo he visto en línea, donde eso ayuda a muchas otras personas ... lamentablemente no tuve suerte con eso. – ThoughtCrhyme

+0

¿Qué configuración está utilizando? ¿Puede pegar aquí la configuración? ¿Has verificado la publicación que he dado como referencia? – IBhadelia

+0

No estoy usando IIS por lo que no hay .config – ThoughtCrhyme

1

Podría ser sólo una parte del rompecabezas para que funcione para usted, pero esto me llamó a cabo por algún tiempo:

Es posible que deba verificar dos veces su sintaxis JSON, creo que debe ser una cadena doble entre el nombre de la variable y la variable.

p. Ej.

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

necesita ser:

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

n.b. comillas dobles "mensaje"


EDIT: Gracias por los comentarios de abajo, aquí un par de enlaces que pueden resultar útiles para el formato JSON:

+0

-1: ese objeto no es "JSON", es solo otro objeto de JavaScript. JS es más indulgente con el análisis sintáctico y no se requieren comillas dobles. –

+0

Hola @Matti Virkkunen, veo de dónde vienes ... Estoy de acuerdo en que JavaScript es más "indulgente", pero JSON, el formato de intercambio de datos (es decir, que no requiere JavaScript) es más estricto. www.JSON.org sugiere el uso de comillas dobles. Pero, para ser sincero, no puedo encontrar un buen enlace al borrador de trabajo de ECMAScript 5 para obtener información autorizada, pero http://developer.yahoo.com/yui/json/ (Acerca del formato JSON) es bastante autoritario. Recuerde que la sintaxis JSON no es JavaScript por decir (recuerde que JSON se puede usar con javascript) es solo un formato basado en/inspirado por un subconjunto de javacript. –

+0

@Matti Virkkunen Dicho todo lo anterior, es cierto que probablemente pueda salirse con la suya sin utilizar comillas dobles para pares de valor/cadena. Los ejemplos en la documentación de jquery.post no los tienen. Y, de hecho, la documentación de jquery.post ni siquiera dice que necesite usar JSON. Pero de cualquier manera, no creo que se merezca un -1, especialmente porque el C# en el lado del servidor requiere las comillas dobles. http://stackoverflow.com/questions/4939620/can-wcf-accept-json-encoded-using-single-quotes-and-non-quoted-identifiers Si he ayudado a aclarar las cosas, no dude en enviarme su - 1, si no hay preocupaciones –

Cuestiones relacionadas