2009-01-29 9 views
9

El siguiente código se ejecuta correctamente cuando la clave de datos no tiene datos para enviar, es decir, datos: "{}" un objeto JSON vacío y el servicio web no toma parámetros. Me gustaría publicar algunos datos en el servicio web, pero me estoy metiendo en problemas.Llamar .Net webservice con Jquery está causando desgracia al tratar de publicar datos

Cuando intento configurar esto a los datos: "{ 'nombre': 'Niall', 'nombre': 'Smith'}", me sale un error

{"Message":"Invalid web service call, missing value for parameter: \u0027json\u0027.","StackTrace":" at System.Web.Script.Services.WebServiceMethodData.CallMethod(Object target, IDictionary`2 parameters)\r\n at System.Web.Script.Services.WebServiceMethodData.CallMethodFromRawParams(Object target, IDictionary`2 parameters)\r\n at System.Web.Script.Services.RestHandler.InvokeMethod(HttpContext context, WebServiceMethodData methodData, IDictionary`2 rawParams)\r\n at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.InvalidOperationException"} 

El servicio web no se ejecuta.

Esta es mi llamada Jquery para volver a enviar mis datos al servidor.

$.ajax({ 
     type: "POST", 
     url: "/WebServices/BasketServices.asmx/AddItemToBasket", 
     data: "{'name':'niall'}", // Is this Correct?? 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: OnItemAddedSuccess 
    }); 
function OnItemAddedSuccess(result,eventArgs) { 
    //deserialize the JSON and use it to update the Mini Basket 
    var response = JSON.parse(result.d); 
} 

aquí es mi WebService

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[System.ComponentModel.ToolboxItem(false)] 
[System.Web.Script.Services.ScriptService] 
public class BasketServices : System.Web.Services.WebService 
{ 
    [WebMethod(true)] 
    public string AddItemToBasket(string json) 
    { 
     //do stuff 
     return myString.toJSON(); 
    } 
} 

Cuál podría ser el problema? ¿Es el formato de los datos JSON para publicar? Podría ser que no haya configurado los Atributos correctos en mi WebService. ¿Qué pasa con los problemas aludidos en Dave Ward's post

He intentado todo lo que se me ocurre. ¿Alguien tiene alguna idea?

Respuesta

12

Creo que el servicio web espera que el parámetro json que desea ajustar. Pruebe esta llamada AJAX:

var data = {'name':'niall'}; 

$.ajax({ 
    type: "POST", 
    url: "/WebServices/BasketServices.asmx/AddItemToBasket", 
    data: "json=" + JSON.stringify(data), 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: OnItemAddedSuccess 
}); 

donde JSON.stringify() es un método como el que se encuentra en la aplicación "oficial": http://json.org/js.html

+0

+1, esto me ayudó a superar mi problema. Dado que espera que json sea una cadena y no un tipo complejo en el servicio, en realidad debería ser 'var data = {'json': 'niall'};' seguido de 'data: JSON.stringify (data),' luego . – DougJones

2

Esto debería funcionar. Debe pasar JSON como una cadena, con un nombre de parámetro 'json' (que es el mismo que el nombre de parámetro en el método Web.

data: "{json: '{\'name\':\'niall\'}'}",

+0

he estado buscando esto durante 4 horas ahora. ¿Por qué no podría JSON.stringify agregar esto basado en el nombre de la variable javascript? – terjetyl

0

esto siempre me pasa cuando lo haga no ajustar los datos de cadena con comillas dobles

5

La solución anterior no funcionó para mí. Entonces, en cambio, hice lo siguiente. 1.) asegúrese de que las propiedades-objeto javascript (aquí Id. Y Cantidad) tienen el mismo nombre y el mismo tipo (en este caso número == int) que el parámetro de su servicio web 2.) No ajuste el objeto en un objeto de transferencia de datos (DTO), pero en cambio sólo les stringify Gracias va a Yasin Tarim que dio los consejos que necesitaba para conseguir que funcione

// javascript object 
var cartItem = {"ID": 123, "Quantity": 2} 

$.ajax({ 
    type: "POST", 
    url: "/WebServices/BasketServices.asmx/AddItemToBasket", 
    data: JSON.stringify(cartItem), 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function (data) { OnSuccess(cartItem, data); }, 
}); 
 
    // ASMX Server Side Code 
    [WebMethod(Description = "Add item to ShoppingCart")] 
    [ScriptMethod(UseHttpGet = false, ResponseFormat = ResponseFormat.Json)]   
    public string AddItemToBasket(int ID, int Quantity) 
    {    
     CartItem cI = new CartItem(); 
     cI.iD = ID; 
     cI.qty = Quantity; 
     CartItem.SaveToDatabase(ci); 
     return "foo from Webservice - it worked"; 
    } 
+0

"Ningún constructor sin parámetros definido para el tipo" y "Primitiva JSON no válida" y "Llamada al servicio web no válido, valor faltante para el parámetro" fueron los mensajes de error que recibí en mis diversas combinaciones. – surfmuggle

+0

Sí, esto funcionó para mí también ... Tuve que agregar en el código del lado del servidor cada variable por tipo y nombre, de lo contrario no funciona ... Al menos no para mí, por lo que cada variable que tienes en tu cadena json necesita estar en el back end también. – IamCavic

Cuestiones relacionadas