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