当数据密钥没有要发送的数据时,以下代码正确执行,即数据:“{}”空JSON对象,而webservice不带参数。我想将一些数据发布到网络服务,但我遇到了麻烦。
当我尝试将其设置为数据时:“{'name':'Niall','surname':'Smith'}”,我收到错误
{"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"}
未执行网络服务。
这是我的Jquery调用,将我的数据发回服务器。
$.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
[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's post
中提到的问题怎么样?我已经尝试了所有我能想到的东西。有没有人有任何想法?
答案 0 :(得分:12)
我认为webservice期望设置参数json
。试试这个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
});
其中JSON.stringify()
是一种类似于“官方”实施中的方法:http://json.org/js.html
答案 1 :(得分:5)
上述解决方案对我不起作用。所以相反,我做了以下。 1.)确保javascript对象属性(此处为ID和Quantity)具有相同的名称和相同的类型(在本例中为number == int)作为webservice的参数 2.)不要将对象包装到数据传输对象(DTO)中,而是将它们字符串化 感谢Yasin Tarim,它提供了我需要的提示才能使其正常工作
// 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"; }
答案 2 :(得分:2)
这应该有效。您应该将json作为字符串传递,参数名称为“json”(与Web方法中的参数名称相同。
data: "{json: '{\'name\':\'niall\'}'}",
答案 3 :(得分:0)
当我不用双引号
包装字符串数据时,这总会发生在我身上