2012-09-03 4 views
2

저는 ASP.NET Web API에 대한 첫 번째 시도를하고 있으며, 많은 좌절감을 불러 일으키는 문제가 있습니다. 내가 반환에게 같은 데이터를 호출하고있어ASP.NET 웹 API ReadAsAsync가 오류없이 실패합니다.

평온한 서비스 :

<SearchResults xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <Results> 
     <Result> 
      <Title>foo</Title> 
     </Result> 
     <Result> 
      <Title>bar</Title> 
     </Result> 
    </Results> 
    <NumberOfResults>2</NumberOfResults> 
</SearchResults> 

그래서 나는이 데이터를 표현하기 위해 몇 가지 요소를 만들었습니다

[Serializable, DataContract(Namespace = "")] 
public class SearchResults 
{ 
    public List<Result> Results { get; set; } 
    public int NumberOfResults { get; set; } 
} 

[Serializable, DataContract(Namespace = "")] 
public class Result 
{ 
    public string Title { get; set; } 
} 

을 그리고 나는 직렬화하려고 시도 데이터 :

결과가 null 인 SearchResults 개체가 생성되고 번호 OfResults = 0은 반환되는 결과가 있음을 알지만 response.Content.ReadAsStringAsync()를 검사하면 XML에 예상 한 결과가 포함됩니다.

var serializer = new XmlSerializer(typeof(SearchResults)); 
var results = (SearchResults)serializer.Deserialize(response.Content.ReadAsStreamAsync().Result); 

을 그리고 완전히 채워의 SearchResult 객체를 반환

내가 대신했습니다.

마지막으로, 간단한 IFormatterLogger를 구현하고 스트림을 두 번 (예상대로!) 읽으려고 시도했지만 ReadAsAsync를 사용하여 deserialization 할 때 표준 시도 중에 호출되지 않으면 호출 된 ReadAsAsync에 전달했습니다.

난 그냥 XmlSerializer를 사용하고 그 작동하기 때문에 그것을 증기를 통과,하지만 ReadAsAsync를 사용하는 것과 같은 단정하고 깔끔하지 않는 것, 게다가 난 정말 내가 잘못 뭘하는지 :

알고 싶어 수

업데이트 됨 16 : 38BST 03/09/2012

웹 API를 사용할 때 분명히 중요한 사항이 누락되었습니다. 그러나 나는 아직도 모릅니다.

필자는 PUT 동사가 포함 된 서비스를 사용하려고 시도했으며 XmlSerializer를 사용하여 테스트했을 때 엔티티가 올바르게 serialize되는 동안 HTTP 500으로 요청이 실패했습니다. Fiddler와 XML로 생성 된 내용을 확인했습니다. 웹 API에 의해 XmlSerializer에 의해 생성 된 것과 아무 것도 보이지 않습니다. 처음에는 everthing이 단순히 "Name"이 아닌 "_x003C_Name_x003E_k__BackingField"와 같은 이름을가집니다.

+0

다른 시리얼 라이저를 사용하고있는 것 같습니다. XML이 WCF XML (예 : DataContractSerializer) 또는 XmlSerializer 인 것처럼 보입니까? 패킷 크기를 serialize/deserialize 및 reduce하는 것이 훨씬 빠르기 때문에 JSON을 사용하는 것이 좋습니다. – leon

+0

불행히도 서비스 사이드 코드를 제어 할 수없고 XML 만 지원하므로 JSON은 옵션이 아닙니다. 나는 그것이 다른 끝의 WCF 일 수 있다고 생각하지만 확신 할 수는 없다. 확실히 상대방의 기술은 무의미해야 하나?질문에서 언급했듯이 XmlSerializer는받은 데이터를 deserialize하는 데 아무 문제가 없습니다. – VaticanUK

+0

Ahh 예치 - 그럼 분명히 WCF입니다. WCF에는 해당 백업 필드 속성 이름이 포함 된 프록시 클래스가 있습니다. WCF를 사용하기 때문에 WebAPI와는 다른 스택이므로 ReadAsAsync에서는 직렬화/직렬화 해제가 쉽지 않습니다. 추측하면 XML을 POCO로 가져 오기 위해 매퍼 (mapper)를 사용해야합니다. (편집 : 여기를보세요 http://www.integratedwebsystems.com/2009/05/wcf-data-contracts-and-k__backingfield-property-naming/) 나를 위해 – leon

답변

0

내 업데이트의 이상한 "k__BackingField"이름이 나를 해결책으로 인도했으며, 평소와 같이 매우 간단했습니다.

DataMemberAttribute를 사용하여 엔티티의 속성을 표시하는 것을 잊어 버렸습니다.

마킹하여 모두 원래 예상대로 작동했습니다!

그게 전부 였어!

+1

ReadAsAsync [Serializable] 특성을 사용하여 클래스를 deserialize 할 수 없습니다. deserialization 속성을 제거한 후 예상대로 작동했습니다. – neo112