链接 table 的 ASMX 循环引用错误
A circular reference error with ASMX with linked table
我在 Web 应用程序中有以下 ASMX service
代码。正在尝试获取 XML 格式的数据。为了清楚起见,我删除了一些数据
/// <summary>
/// Summary description for CompanyServices
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
// [System.Web.Script.Services.ScriptService]
public class CompanyServices: System.Web.Services.WebService
{
[WebMethod]
public List<Product> GetData(int companyId, int custId)
{
return ProductService.GetCompanyData(companyId, custId).ToList();
}
在调试模式下所有运行,但我不断收到错误
System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException: A circular reference was detected while serializing an object of type Company
所以我创建了相同的类型并且围绕它有一个类似于
的循环
foreach (Product p in ProductService.GetCompanyData(companyId, custId).ToList())
{
Product newProd = new Product
newProd.Name = p.Name;
newProd.Department = p.Department;
}
这一直有效,直到我添加部门,它链接到另一个 table(部门)
用 Google 搜索但不知道是什么原因造成的或如何解决?
循环引用意味着你有一个对象 a
引用了 b
(例如 a.B = b
),但不知何故 b
引用了 a
(例如 b.A = a
).
不幸的是,两个对象并不总是指向另一个对象。导致循环的链条可以更长(比如 product
指向另一个 product
指向 department
又指向 product
)。
大多数时候,根本原因是您的服务公开了使用父子关系连接的原始 Entity Framework(或其他 ORM)对象。因为 ORM 导航属性是延迟加载的,任何时候你有一个 product
,它有它的父级(比如 product.Department
)但是 department
有 Products
属性指向产品,其中一个产品与您在开始时访问过的产品完全相同。有你的周期。
解决方案是创建另一组 类,即 DTO 类,您只在其中维护单向导航属性。因此,例如,ProductDTO
有其父项 DepartmentDTO
,但 DepartmentDTO
故意 缺少 IEnumerable<ProductDTO> Products
属性 .
这样,跟随您的导航属性的序列化程序会在某个点停止,因为没有循环。您的服务公开了这些 DTO 类
[WebMethod]
public List<ProductDTO> GetData(int companyId, int custId)
{
return ProductService.GetCompanyData(companyId, custId).ToDTO();
}
我在 Web 应用程序中有以下 ASMX service
代码。正在尝试获取 XML 格式的数据。为了清楚起见,我删除了一些数据
/// <summary>
/// Summary description for CompanyServices
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
// [System.Web.Script.Services.ScriptService]
public class CompanyServices: System.Web.Services.WebService
{
[WebMethod]
public List<Product> GetData(int companyId, int custId)
{
return ProductService.GetCompanyData(companyId, custId).ToList();
}
在调试模式下所有运行,但我不断收到错误
System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException: A circular reference was detected while serializing an object of type Company
所以我创建了相同的类型并且围绕它有一个类似于
的循环foreach (Product p in ProductService.GetCompanyData(companyId, custId).ToList())
{
Product newProd = new Product
newProd.Name = p.Name;
newProd.Department = p.Department;
}
这一直有效,直到我添加部门,它链接到另一个 table(部门)
用 Google 搜索但不知道是什么原因造成的或如何解决?
循环引用意味着你有一个对象 a
引用了 b
(例如 a.B = b
),但不知何故 b
引用了 a
(例如 b.A = a
).
不幸的是,两个对象并不总是指向另一个对象。导致循环的链条可以更长(比如 product
指向另一个 product
指向 department
又指向 product
)。
大多数时候,根本原因是您的服务公开了使用父子关系连接的原始 Entity Framework(或其他 ORM)对象。因为 ORM 导航属性是延迟加载的,任何时候你有一个 product
,它有它的父级(比如 product.Department
)但是 department
有 Products
属性指向产品,其中一个产品与您在开始时访问过的产品完全相同。有你的周期。
解决方案是创建另一组 类,即 DTO 类,您只在其中维护单向导航属性。因此,例如,ProductDTO
有其父项 DepartmentDTO
,但 DepartmentDTO
故意 缺少 IEnumerable<ProductDTO> Products
属性 .
这样,跟随您的导航属性的序列化程序会在某个点停止,因为没有循环。您的服务公开了这些 DTO 类
[WebMethod]
public List<ProductDTO> GetData(int companyId, int custId)
{
return ProductService.GetCompanyData(companyId, custId).ToDTO();
}