I have create a test page with a grid. I consume a simple webservice (mobileservice.asmx). I have configured my dataasource and webservice to use JSON. However as soon as i want to sent parameters the webservice call fails with errors like:
{"Message":"Invalid JSON primitive: vn.","StackTrace":" bij System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject()\r\n bij System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)\r\n bij System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)\r\n bij System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)\r\n bij System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](String input)\r\n bij System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext context, JavaScriptSerializer serializer)\r\n bij System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData, HttpContext context)\r\n bij System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.ArgumentException"}
it seems that webservice parameters are not sent as JSON.
mobileservice.asmx
successful page, no parameters:
if i change to the configuration below i get the error:
{"Message":"Invalid JSON primitive: vn.","StackTrace":" bij System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject()\r\n bij System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)\r\n bij System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)\r\n bij System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)\r\n bij System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](String input)\r\n bij System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext context, JavaScriptSerializer serializer)\r\n bij System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData, HttpContext context)\r\n bij System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.ArgumentException"}
closer expection reveals that the parameters are not send as JSON:
{"Message":"Invalid JSON primitive: vn.","StackTrace":" bij System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject()\r\n bij System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)\r\n bij System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)\r\n bij System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)\r\n bij System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](String input)\r\n bij System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext context, JavaScriptSerializer serializer)\r\n bij System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData, HttpContext context)\r\n bij System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.ArgumentException"}
it seems that webservice parameters are not sent as JSON.
mobileservice.asmx
[WebMethod(EnableSession = true)][ScriptMethod(ResponseFormat = ResponseFormat.Json)]public Item[] GetRecords2(string vn){ IDataView view = DatabaseSession.Current.GetOrCreateView(vn); List<Item> items = new List<Item>(view.GetRecords(0, 40).Cast<IItemRecord>().Select(i => new Item() { Code = i.Code, Description = i.Description })); //count = view.RecordCount; return items.ToArray();} [WebMethod(EnableSession = true)][ScriptMethod(ResponseFormat = ResponseFormat.Json)]public Item[] GetRecords3(){ IDataView view = DatabaseSession.Current.GetOrCreateView("prd.item"); List<Item> items = new List<Item>(view.GetRecords(0, 40).Cast<IItemRecord>().Select(i => new Item() { Code = i.Code, Description = i.Description })); //count = view.RecordCount; return items.ToArray();} public class Item{ public string Code { get; set; } public string Description { get; set; }}successful page, no parameters:
$(document).ready(function () { window.kendoMobileApplication = new kendo.mobile.Application(document.body); $("#grid").kendoGrid({ dataSource: { transport: { read: { type: "POST", url: "/webservices/mobile.asmx/GetRecords3", contentType: "application/json; charset=utf-8", data: {}, dataType: "json" } }, schema: { data: "d", model: { fields: { __type : { type: "string" }, Code: { type: "string" }, Description: { type: "string" }, } } }, error: onError }, dataBound: ondataBound, columns: [ { title: "Code", field: "Code" }, { title: "Description", field: "Description"}], height: 300 });if i change to the configuration below i get the error:
{"Message":"Invalid JSON primitive: vn.","StackTrace":" bij System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject()\r\n bij System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)\r\n bij System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)\r\n bij System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)\r\n bij System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](String input)\r\n bij System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext context, JavaScriptSerializer serializer)\r\n bij System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData, HttpContext context)\r\n bij System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.ArgumentException"}
$(document).ready(function () { window.kendoMobileApplication = new kendo.mobile.Application(document.body); $("#grid").kendoGrid({ dataSource: { transport: { read: { type: "POST", url: "/webservices/mobile.asmx/GetRecords2", contentType: "application/json; charset=utf-8", data: { vn : "prd.item"}, dataType: "json" } }, schema: { data: "d", model: { fields: { __type : { type: "string" }, Code: { type: "string" }, Description: { type: "string" }, } } }, pageSize: 10, serverPaging: true, error: onError }, dataBound: ondataBound, columns: [ { title: "Code", field: "Code" }, { title: "Description", field: "Description"}], height: 300 });closer expection reveals that the parameters are not send as JSON:
-
Request URL:http://localhost:51200/webservices/mobile.asmx/GetRecords2
-
Request Method:POST
-
Status Code:500 Internal Server Error