![](/img/trans.png)
[英].Net Core 3.0 possible object cycle was detected which is not supported
[英]A possible object cycle was detected which is not supported
我知道這里有關於那個特定問題的問答,但我的問題並不獨特(我猜)。
這是我的模型類:
public class RoleMaster
{
[Key]
[Required]
public int Id { get; set; }
[Required]
[StringLength(20)]
public string Role { get; set; }
}
這是我的控制器:
public class RolesController : ControllerBase
{
private readonly IRolesRepository _repo;
public RolesController(IRolesRepository repo)
{
_repo = repo;
}
[HttpGet]
public IActionResult Get()
{
var roles = _repo.GetRoles();
return new JsonResult(roles);
}
}
我的存儲庫:
public interface IRolesRepository
{
Task<IEnumerable<RoleMaster>> GetRoles();
}
這是 GetRoles 方法:
public async Task<IEnumerable<RoleMaster>> GetRoles()
{
try
{
var roles = await db.RoleMaster.AsNoTracking().ToListAsync();
return roles;
}
catch (Exception)
{
throw;
}
}
這是我得到的錯誤:
處理請求時發生未處理的異常。 JsonException: 檢測到不支持的可能的對象循環。 這可能是由於循環或對象深度大於最大允許深度 32。 System.Text.Json.ThrowHelper.ThrowInvalidOperationException_SerializerCycleDetected(int maxDepth)
從其他問題我發現,如果您有其他表的引用,那么可能會發生這種錯誤,但在我的情況下,不涉及其他表。 這是我創建的第一個表,只是在嘗試 get 方法。
_repo.GetRoles();
未使用await
關鍵字
這個var roles = _repo.GetRoles();
應該
var roles = await _repo.GetRoles();
你混合異步和非異步,
下面未經測試,但你應該得到 jist
[HttpGet]
public async Task<IActionResult> Get()
{
var roles = **await** _repo.GetRoles();
return new JsonResult(roles);
}
僅供參考 - 我原來的答案實際上是正確的.... objectA 是... Task
,因為那是從_repo.GetRoles();
返回的_repo.GetRoles();
您的對象 A 引用了引用對象 A 的對象 B。
這只是以遞歸循環結束,基本上永遠不會結束嘗試序列化。
可能的對象循環
此外,您沒有包含可能拋出 JsonResult 異常的代碼,因此看不到您使用的序列化程序。
此外,如果您使用的是 newtonJson,那么對復雜對象的支持就更加有限。
進一步 - 只是一個基於 q 的 FYI 注釋非異步版本,因為如果你不想改變它,你的主(控制器)線程不是異步的,如上所述或為了清楚起見
public List<RoleMaster> GetRoles()
{
try
{
var roles = db.RoleMaster.AsNoTracking().ToList();
return roles;
}
catch (Exception)
{
throw;
}
}
更新以獲取更多指導
https://docs.microsoft.com/en-us/aspnet/core/web-api/action-return-types?view=aspnetcore-3.1
我有同樣的問題。
這就是解決我的問題的原因:
將 JsonIgnore 屬性放在引用屬性上(導致無休止的序列化)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.