关于ajax:在尝试发布数据时,使用Jquery调用.Net Web服务会造成祸患

Calling .Net webservice with Jquery is causing woe when trying to post data

当数据键没有要发送的数据时,以下代码正确执行,即数据:"{}"空JSON对象,而webservice不带参数。 我想将一些数据发布到网络服务,但我遇到了麻烦。

当我尝试将其设置为数据时:"{'name':'Niall','surname':'Smith'}",我收到错误

1
2
3
4
5
6
7
{"Message":"Invalid web service call, missing value for parameter: \u0027json\u0027.","StackTrace":"   at System.Web.Script.Services.WebServiceMethodData.CallMethod(Object target, IDictionary`2 parameters)

   at System.Web.Script.Services.WebServiceMethodData.CallMethodFromRawParams(Object target, IDictionary`2 parameters)

   at System.Web.Script.Services.RestHandler.InvokeMethod(HttpContext context, WebServiceMethodData methodData, IDictionary`2 rawParams)

   at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.InvalidOperationException"}

Web服务未执行。

这是我的Jquery调用,将我的数据发布回服务器。

1
2
3
4
5
6
7
8
9
10
11
12
    $.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);
}

这是我的WebService

1
2
3
4
5
6
7
8
9
10
11
12
13
[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();
    }
}

问题是什么? 是要发布的JSON数据的格式吗? 可能是我没有在我的WebService上设置正确的属性。 Dave Ward的帖子中提到的问题怎么样?

我已经尝试了我能想到的一切。 有没有人有任何想法?


我认为webservice期望设置参数json。 试试这个AJAX调用:

1
2
3
4
5
6
7
8
9
10
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
});

其中JSON.stringify()是一种类似于"官方"实现中的方法:http://json.org/js.html


上面的解决方案对我不起作用。 所以相反,我做了以下。
1.)确保javascript对象属性(此处为ID和Quantity)具有相同的名称和相同的类型(在本例中为number == int)作为webservice的参数
2.)不要将对象包装到数据传输对象(DTO)中,而是将它们字符串化
谢谢Yasin Tarim给出了我需要的提示才能让它运转起来

1
2
3
4
5
6
7
8
9
10
11
// 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); },
});
1
2
3
4
5
6
7
8
9
10
11
    // 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";
    }


这应该工作。 您应该将json作为字符串传递,参数名称为"json"(与Web方法中的参数名称相同)。

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


当我没有用双引号包装字符串数据时,这总是发生在我身上