.net - servicemodel - WCF, POSTING JSONized datos
habilitar metadatos wcf (3)
Entonces, el problema que está experimentando es un error de serialización. WCF quiere ver el nombre de las propiedades en el JSON envuelto con ""
Así que me encontré con el mismo error donde
data:''{id: 1 }'',
no funcionó pero
data:''{"id": 1 }'',
funcionó
Espero que esto ayude a alguien más a salir
Tengo un tipo complejo:
[DataContract]
public class CustomClass
{
[DataMember]
public string Foo { get; set; }
[DataMember]
public int Bar { get; set; }
}
Luego tengo un servicio web RESTful de WCF que tiene esto:
[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "/class/save")]
bool Save(CustomClass custom);
así que en el lado del navegador jasonize mi objeto CustomClass para que se vea así:
var myClass = "{ foo: /"hello/", bar: 2 }";
$.ajax({
contentType: "application/json",
data: { custom: myClass },
dataType: "json",
success: callback,
type: "POST",
url: "MyService.svc/class/save"
});
Presento los datos con jquery usando $ .ajax para poder establecer manualmente el tipo de contenido en "application / json" y cuando se envía, el postcuerpo se ve como
custom=<uri encoded version of myClass>
Obtuve el siguiente error:
El servidor encontró un error al procesar la solicitud. El mensaje de excepción es ''Hubo un elemento de inicio de comprobación de error del objeto de tipo MyAssembly.CustomClass. Encontrado el carácter inesperado ''c''. ''. Vea los registros del servidor para más detalles. El seguimiento de la pila de excepción es: en System.Runtime.Serialization.XmlObjectSerializer.IsStartObjectHandleExceptions (lector de XmlReaderDelegator) en System.Runtime.Serialization.Json.DataContractJsonSerializer.IsStartObject (lector de XmlDictionaryReader) en System.ServiceModel.Dispatcher.SingleBodyParameterMessageFormatter.ReadObject (mensaje de mensaje) en System.ServiceModel.Dispatcher.SingleBodyParameterMessageFormatter.DeserializeRequest (Message message, Object [] parameters) en System.ServiceModel.Dispatcher.DemultiplexingDispatchMessageFormatter.DeserializeRequest (Message message, Object [] parameters) en System.ServiceModel.Dispatcher.UriTemplateDispatchFormatter.DeserializeRequest (Message message, Object [] parameters) en System.ServiceModel.Dispatcher.CompositeDispatchFormatter.DeserializeRequest (Message message, Object [] parameters) en System.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs (MessageRpc & rpc) en System.ServiceModel.Dispatcher.DispatchOperationRuntime.Invok eBegin (MessageRpc & rpc) en System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5 (MessageRpc & rpc) en System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4 (MessageRpc & rpc) en System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3 (MessageRpc & rpc) en System. ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2 (MessageRpc & rpc) en System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1 (MessageRpc & rpc) en System.ServiceModel.Dispatcher.MessageRpc.Process (Boolean isOperationContextSet)
He intentado envolver mis datos jsonizados ... he intentado usar $ .post para enviar el mensaje (pero eso no establece el tipo de contenido en application / json para que el servicio web no comprenda) ... ¿alguna idea?
El problema del que ha escapado se ha creado correctamente, pero cuando está creando un objeto Json complejo en el método de publicación de jQuery, no está escapando el contenedor. Entonces, necesitas escapar de un objeto JS completo como este: "{/" custom / ": /" {foo: / "hello /", bar: 2} / "}" (en realidad, no lo intenté yo mismo, pero debería funcionar), o (probablemente una mejor solución) use JSON.stringify ({custom: myClass})
WCF es realmente sensible a los objetos JSON que recibe para la serialización.
Eche un vistazo aquí para algunas de sus respuestas: ¿Cómo publicar una matriz de objetos complejos con JSON, jQuery para ASP.NET MVC Controller?