2009-03-23 4 views
7

jqueryを使用して、いくつかのテーブルを含むデータセットを返すWebサービスを呼び出しています。System.Globalization.CultureInfoタイプのオブジェクトをシリアル化している間に循環参照が検出されました

パラメータを受け入れるために私のwebmethodを設定する必要があるまで、これはうまくいきました。私はこれをクライアント側に反映しました

data: "{paramname:'" + paramval+ "'}", 

webmethodが戻るときに次のエラーが表示されます。これは、データセットWebMethod属性は、クライアント側のJSは、データを除いて以下のように同じに見えるパラメータはありません

Error:{"Message":"A circular reference was detected while serializing an object of type \u0027System.Globalization.CultureInfo\u0027.","StackTrace":" at System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat)\r\n at ...etc

に返されるいただきまし関わらず起こる:行が削除されます。

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}, 

に要求を変更する提案を1として、次のエラーをもたらします。

Error:{"Message":"Invalid JSON primitive: paramval.","StackTrace":"
at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject()\r\n at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)\r\n at System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)\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](String input)\r\n at System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext context, JavaScriptSerializer serializer)\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"} Status: 500

+0

で同じ

[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); } } 

はちょうどあなたが(実際のJSON VS)文字列としてJSONデータを送信する権利あり、注意します。あなたは、エラーを解決する方法に質問を言い換えてみてください: 「タイプ可能System.Globalization.CultureInfoのオブジェクトをシリアル化しながら、循環参照が検出されました」 (サーバーで何が起こっているかである) – meandmycode

答えて

5

私は

ds.GetXml(); 

を返すために、私のWebMethod属性を変更し、これが働いていました。データセットがシリアル化可能であることを考えると、なぜ私はこれをやらなければならないのか分かりませんが、この障害を乗り越えてしまいます。

+0

してくださいあなたが説明できますどのようにあなたのwebmethodを変更しましたか? – Pomster

1

私は、オブジェクトの遅延ロードを作る私のエンティティからの仮想キーワードを削除し、

を正確に同じ問題を抱えていました。

問題が解決しました。

0

私はこの問題が解決されたことを知っていますが、私は同じ問題に遭遇しました。私はここで私のために働いたものを置くべきだと思って、他の人がうまくいけば問題に取り組むことができます。 paramsはは、型変換例外サーバがあった場合、私はこの応答に走っ{"key":"value"}

0

に等しい私は必要な結果

を得JSON.stringify方法を用いることにより

data: JSON.stringify(Params), 

側。

1

これは、entityrefsとエンティティセットでオブジェクトをシリアル化するときによく発生します。 例えば、あなたは、多くの場合、元のオブジェクトに終わるので、ループを作成し、シリアライザはProductCategoryに行くとそこaswellすべてのセットをシリアル化しようとします。この

public EntitySet<ProductCategory> Subcategories 

のようなセットを持っている場合。

これを避ける最も良い方法は、[ScriptIgnore]と[NonSerialized]をフィールドに、[ScriptIgnore]をこのようなプロパティにすることです。参考文献

関連する問題