[c#] Web API에서 응답을 직렬화하지 못했습니다.

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