【发布时间】:2017-10-22 07:06:58
【问题描述】:
我正在尝试将一些信息(包括 ClaimsIdentity)从一个 Web Api 发送到另一个 Web Api。
问题在于错误:
Self referencing loop detected for property 'Subject' with type 'System.Security.Claims.ClaimsIdentity'. Path 'Actor.Claims[0]'.
这是我的代码:
CreateActivityModel.cs
public class CreateActivityModel {
public string Action { get; set; }
public ClaimsIdentity Actor { get; set; }
public string Url { get; set; }
}
序列化代码:
var model = new CreateActivityModel {
Actor = (ClaimsIdentity) User.Identity,
Action = "Caller - call",
Url = Request.RequestUri.ToString()
};
string json = JsonConvert.SerializeObject(model);
在我的 WebApiConfig.cs 中:
var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
jsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
jsonFormatter.SerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.Objects;
虽然我设置了ReferenceLoopHandling.Ignore,但错误依旧存在。
【问题讨论】:
-
如何实现自己的 DefaultContractResolver 并从序列化中排除该循环属性?说实话,最好的方法是创建您自己的 DTO 并发送它 - 这是您的类型,您可以完全控制它。
-
@ArtavazdBalayan 您能否提供一个示例来创建我自己的 DTO?
-
jsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;是解决方案。我认为您的jsonFormatter对象未被使用。 -
不管我把设置放在哪里,我什至都把它放在了
Startup.cs,但是没有用。 @约翰肯尼迪 -
你使用的是dot net core吗?
标签: c# asp.net-mvc serialization json.net claims-based-identity