我正在使用jquery来调用一个webservice,它返回一个包含几个表的数据集。
这工作正常,直到我需要设置我的webmethod来接受参数。我在客户端用
反映了这一点data: "{paramname:'" + paramval+ "'}",
我现在在webmethod返回时收到以下错误。无论数据集中返回什么
,都会发生这种情况错误:{“消息”:“序列化时检测到循环引用 类型的对象 \ u0027System.Globalization.CultureInfo \ u0027。“,”StackTrace“:”at System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(对象 o,StringBuilder sb,Int32 depth,Hashtable objectsInUse, SerializationFormat serializationFormat)\ r \ n at ... etc
当webmethod没有参数时,客户端js看起来与下面相同,除了数据:line被删除。
function ClientWebService(paramval){
$.ajax({
type: "POST",
url: "WebService1.asmx/webmethodName",
data: "{paramname:'" + paramval+ "'}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(msg) {
ParseResult(msg.d);
},
error: function(err) {
if (err.status == 200) {
ParseResult(err);
}
else { alert('Error:' + err.responseText + ' Status: ' + err.status); }
}
});
}
编辑:根据建议将请求更改为
data: {paramname: paramval},
产生以下错误。
错误:{“消息”:“无效的JSON原语:paramval。”,“StackTrace”:“
在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject(个)\ r \ n 在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(的Int32 深度)\ r \ n at System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(字符串 输入,Int32 depthLimit,JavaScriptSerializer序列化程序)\ r \ n at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer,String input,Type type,Int32 depthLimit)\ r \ n at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize [T](字符串 输入)\ r \ n at System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext的 context,JavaScriptSerializer序列化程序)\ r \ n at System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData,HttpContext context)\ r \ n at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext的 context,WebServiceMethodData methodData)“,”ExceptionType“:”System.ArgumentException“}状态:500
答案 0 :(得分:5)
我改变了我的webmethod以返回
ds.GetXml();
这很有效。考虑到数据集是可序列化的,我不知道为什么我必须这样做,但它让我克服了这个障碍。
答案 1 :(得分:1)
我遇到了同样的问题,
我从我的实体中删除了虚拟关键字,这会导致延迟加载对象。
问题解决了!!
答案 2 :(得分:1)
在使用entityrefs和entitysets序列化对象时经常会发生这种情况。 例如,如果你有这样的一套
public EntitySet<ProductCategory> Subcategories
序列化程序将进入ProductCategory并尝试序列化那里的所有集合,通常最终返回原始对象,从而创建一个循环。
避免这种情况的最好方法是将[ScriptIgnore]和[NonSerialized]放在字段上,将[ScriptIgnore]放在这样的属性上。
[ScriptIgnore]
[NonSerialized]
private EntitySet<ProductCategory> _Subcategories;
[ScriptIgnore]
[Association(Storage = "_Subcategories", ThisKey = "ID", OtherKey = "ParentID")]
public EntitySet<ProductCategory> Subcategories { get { return this._Subcategories; } set { this._Subcategories.Assign(value); } }
参考文献
答案 3 :(得分:0)
我知道这个问题已得到解答,但我遇到了同样的问题,并认为我应该把对我有用的东西放在这里,以便其他人可以解决这个问题。
data: JSON.stringify(Params),
通过使用 JSON.stringify 方法,我得到了所需的结果
其中参数等于{"key":"value"}
答案 4 :(得分:0)
当存在类型转换异常服务器端时,我遇到了此响应。