2009-03-23 42 views
7

Tôi đang sử dụng jquery để gọi một webservice trả về tập dữ liệu với một vài bảng trong đó.Một tham chiếu vòng tròn đã được phát hiện trong khi sắp xếp một đối tượng thuộc kiểu System.Globalization.CultureInfo

Điều này đã hoạt động tốt cho đến khi tôi cần thiết để thiết lập webmethod của mình để chấp nhận tham số. Tôi phản ánh điều này ở phía khách hàng với

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

Bây giờ tôi nhận được lỗi sau khi trả về webmethod. Điều này xảy ra bất kể những gì được trả lại trong tập dữ liệu

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

Khi webmethod không có tham số, phía máy khách sẽ giống như bên dưới trừ dòng dữ liệu: bị xóa.

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

}

Edit: Theo gợi ý để thay đổi theo yêu cầu để

data: {paramname: paramval}, 

mang lại các lỗi sau.

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

Chỉ cần lưu ý, bạn là đúng để gửi dữ liệu json như là một chuỗi (vs json thực tế). Bạn có thể thử lặp lại câu hỏi về cách giải quyết lỗi: "Đã tìm thấy tham chiếu vòng tròn trong khi sắp xếp một đối tượng thuộc loại System.Globalization.CultureInfo" (đó là những gì đang xảy ra trên máy chủ) – meandmycode

Trả lời

5

tôi đã thay đổi WebMethod của tôi để trở

ds.GetXml(); 

và điều này làm việc. Xem xét các bộ dữ liệu được serializeable Tôi không chắc chắn lý do tại sao tôi phải làm điều này, nhưng nó được tôi vượt qua rào cản này.

+0

nhiều hơn về cách bạn thay đổi bạn webmethod? – Pomster

1

Tôi có cùng một vấn đề chính xác,

Tôi đã xóa từ khóa ảo khỏi Thực thể làm cho việc tải đối tượng bị chậm.

Sự cố được giải quyết !!

0

Tôi biết câu hỏi này đã được trả lời nhưng tôi đã gặp vấn đề tương tự và nghĩ rằng tôi nên đặt những gì làm việc cho tôi ở đây để những người khác hy vọng có thể giải quyết vấn đề.

data: JSON.stringify(Params), 

Bằng việc sử dụng JSON.stringify phương pháp tôi đã có kết quả cần

nơi params bằng {"key":"value"}

0

Tôi chạy vào phản ứng này khi đây là một loại máy chủ chuyển đổi ngoại lệ bên.

1

điều này thường xảy ra khi sắp xếp các đối tượng với entityref và các thực thể. ví dụ nếu bạn có một bộ như thế này

public EntitySet<ProductCategory> Subcategories 

serializer sẽ đi vào ProductCategory và cố gắng serialize tất cả các bộ có là tốt, thường kết thúc lên trở lại trên đối tượng ban đầu, và do đó tạo ra một vòng lặp.

Cách tốt nhất để tránh điều này là đặt [ScriptIgnore] và [NonSerialized] trên các trường và [ScriptIgnore] vào các thuộc tính như thế này.

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

Cùng trên Refs

Các vấn đề liên quan