ASP.NET MVC 웹 API에서 작업 중이 었는데이 오류가 발생했습니다.
‘ObjectContent`1’유형이 ‘application / xml’컨텐츠 유형에 대한 응답 본문을 직렬화하지 못했습니다. charset = utf-8 ‘입니다.
내 컨트롤러는 다음과 같습니다.
public Employee GetEmployees()
{
Employee employees = db.Employees.First();
return employees;
}
이 오류가 발생하는 이유는 무엇입니까?
답변
나에게 이것은 순환 참조의 문제였습니다.
받아 들여진 대답은 JSON 포맷터의 동작 만 변경하기 때문에 저에게 효과가 없었지만 브라우저에서 서비스를 호출 할 때 XML을 얻었습니다.
이 문제를 해결하기 위해 XML을 끄고 JSON 만 반환하도록했습니다.
Global.asax 파일에서 Application_Start 메서드 맨 위에 다음 줄을 추가합니다.
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
이제 JSON 결과 만 반환됩니다. XML 결과가 필요한 경우 다른 솔루션을 찾아야합니다.
답변
global.asax 파일의 Application_start () 메서드에 다음 줄을 추가합니다.
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
도움이 되었기를 바랍니다.
답변
나는 같은 문제가 있습니다. 그리고 나는 그것을 해결했습니다. 기본 생성자를 DTO 클래스에 넣었습니다.
전의:
public class User
{
public User()
{
}
}
당신과 함께 일하기를 바랍니다!
답변
이것을 생성자에 넣으십시오. 이것이 문제를 해결하기를 바랍니다.
public MyController()
{
db.Configuration.ProxyCreationEnabled = false;
}
답변
이에 대한 두 가지 해결책을 찾았습니다. 구현하기 가장 쉬운 첫 번째 방법은 IEnumerables, ICollections를 List 유형으로 변경하는 것입니다. WebAPI는이 개체를 직렬화 할 수 있지만 인터페이스 유형을 직렬화 할 수는 없습니다.
public class Store
{
[StringLength(5)]
public string Zip5 { get; set; }
public virtual List<StoreReport> StoreReports { get; set; } //use a list here
}
다른 옵션은 네이티브 JSON 직렬 변환기를 사용하지 않고 WebApi Config의 Register 메서드에서이 재정의를 실행하는 것입니다.
var json = config.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
config.Formatters.Remove(config.Formatters.XmlFormatter);
답변
해결책은 간단합니다.
LINQ 쿼리 후에 .ToList () (또는 필요한 경우 ToDictionary)를 추가합니다.
데이터의 지연로드보다 빠른로드를 수행합니다.
답변
**이 버그는 클라이언트 측에서 web api / wcf / … 요청에서 호출 할 때 발생하지만 부작용으로 include 키워드로 의존 관계를 포함해야합니다. **
public CustomerPortalContext()
: base("Name=CustomerPortalContext")
{
base.Configuration.ProxyCreationEnabled = false;
}