1

PUT to WebAPI를 사용하여 XML을 보내 데이터베이스에 레코드를 추가하려고합니다. 각 클래스에는 [DataContract] 속성이 있고 해당 필드에는 [DataMember] 속성이 있습니다. 그 이유는 실제 유형 이름을 최종 사용자에게 공개하고 싶지 않기 때문입니다. 다음과 같이WebApi에서 DataContract를 사용하는 직렬화. 형식 중 하나가 null로 변환됩니다.

내 클래스 구조는 다음과 같습니다

public class Customer 
{ 
    [DataMember(Name = "CustomerId")] 
    public int CustomerId { get; set; } 

    [DataMember(Name = "CustomerType")] 
    public CustomerTypeDTO CustomerTypeDto { get; set; } 

    [DataMember(Name = "Name")] 
    public string Name { get; set; } 

    [DataMember(Name = "Orders")] 
    public List<OrderDTO> Orders { get; set; } 
} 

[DataContract(Namespace = "", Name = "CustomerType")] 
public class CustomerTypeDTO 
{ 
    [DataMember(Name = "CustomerTypeId")] 
    public int CustomerTypeId { get; set; } 

    [DataMember(Name = "TypeCode")] 
    public string TypeCode { get; set; } 

} 

[DataContract(Namespace = "", Name = "Order")] 
public class OrderDTO 
{ 
    [DataMember(Name = "OrderId")] 
    public int OrderId { get; set; } 

    [DataMember(Name = "CustomerId")] 
    public int CustomerId { get; set; } 

    [DataMember(Name = "Amount")] 
    public decimal Amount { get; set; } 
} 

내 웹 API 컨트롤러로 XML 받아 들인다 : XML을 수신에

<ArrayOfCustomer> 
    <Customer> 
     <CustomerId>1</CustomerId> 
     <Name>Customer A</Name> 
     <CustomerType> 
      <CustomerTypeId>1</CustomerTypeId> 
      <TypeCode>Corporate</TypeCode> 
     </CustomerType> 
     <Orders> 
      <Order> 
       <OrderId>1</OrderId> 
       <CustomerId>1</CustomerId> 
       <Amount>100000.00</Amount> 
      </Order> 
     </Orders> 
    </Customer> 
</ArrayOfCustomer> 

을의 CustomerType 멤버는 항상 null입니다. 나는 문제를 조사하기 위해 많은 시간을 보냈지만 아무 소용이 없다.

내 컨트롤러 방법은 다음과 같습니다

[RoutePrefix("customers")] 
public class CustomerController : ApiController 
{ 
    [Route("putcustomer")] 
    public async Task<HttpResponseMessage> Put(List<Customer> customers) 
    { 
     var orders = customers[0].Orders; 
     return Request.CreateResponse(HttpStatusCode.OK); 
    } 
} 
+1

적절한 경우 'XmlRoot','XmlAttribute' 또는'XmlMember'로 모델을 장식하십시오. XmlSerializer가 인 WebApi가 클래스를 XML로 serialize하는 방법을 지정합니다. –

+0

@nowhewhomustnotbenamed. 언급 한 속성으로 내 모델을 꾸며 냈습니다. "요청 엔터티의 미디어 유형 'application/xml'이이 리소스에서 지원되지 않습니다." –

+0

응용 프로그램이'XmlSerializer'를 사용하지 않았기 때문일 수 있습니다. 'webapi 솔루션 '은 어떤 시리얼 라이저를 사용합니까? 또한 질문을 업데이트하여 모델의 변경 사항을 반영하십시오. –

답변

1

당신은 함께 보내 XML을 직렬화하는 방법 WebApi에게 전하고있다.

귀하의 경우, 귀하는 Xml without any namespaces을 전송하고 있으므로 바인딩은 null입니다. 나는 위의 XML을 사용하여 솔루션을 테스트

<ArrayOfCustomer xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
<Customer> 
    <CustomerId>20</CustomerId> 
    <CustomerType> 
     <CustomerTypeId>221</CustomerTypeId> 
     <TypeCode>test</TypeCode> 
    </CustomerType> 
    <Name>test</Name> 
    <Orders /> 
</Customer> 
</ArrayOfCustomer> 

그것은 직렬화가 WebApi 및 기본 시리얼에서 수행하는 방법에 대한 자세한 읽어보십시오 :) 작동합니다

은 다음과 같이 당신의 XML 데이터를 전송 해보십시오. 당신이 체크 아웃 할 수 있습니다 (WebApi에 대한)

제안 :

  1. 변경하는 대신 HttpResponse를 사용 IHttpActionResult로 반환 형식. (2.0 릴리스 참조)
  2. 네임 스페이스없이 XML을 제공해야하는 경우 custom xml serializer을 작성하십시오. 자세히보기 here
+1

그것은 사용자 Xml 시리얼 화기와 함께 작동합니다, 정말 고마워! –