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);
}
}
적절한 경우 'XmlRoot','XmlAttribute' 또는'XmlMember'로 모델을 장식하십시오. XmlSerializer가 인 WebApi가 클래스를 XML로 serialize하는 방법을 지정합니다. –
@nowhewhomustnotbenamed. 언급 한 속성으로 내 모델을 꾸며 냈습니다. "요청 엔터티의 미디어 유형 'application/xml'이이 리소스에서 지원되지 않습니다." –
응용 프로그램이'XmlSerializer'를 사용하지 않았기 때문일 수 있습니다. 'webapi 솔루션 '은 어떤 시리얼 라이저를 사용합니까? 또한 질문을 업데이트하여 모델의 변경 사항을 반영하십시오. –