使用.Net Web API我必须编写一个服务来消耗第三方对我们服务器的一些宁静调用。我无法控制我们发送的XML,无论如何都无法更改它。我们只接收HTTP POST调用,它们都是XML格式。
以下是我们将收到的XML消息示例:
<listing-confirmation>
<account-id>123456</account-id>
<allow-bid>true</allow-bid>
<allow-both>true</allow-both>
<allow-buy>true</allow-buy>
<allow-offers>false</allow-offers>
<auction-work-order>1234</auction-work-order>
<bid-count>1</bid-count>
<bid-increment>50</bid-increment>
<buyer-group-name>og_name bg_name</buyer-group-name>
<buyer-group-type>GlobalOpen</buyer-group-type>
<buy-now-price>1000</buy-now-price>
<condition-report-url>some_url</condition-report-url>
<current-bid>700</current-bid>
<end-timestamp>Wed May 25 21:48:09 +0000 2011</end-timestamp>
<event-sale-id>1234</event-sale-id>
<event-sale-name>event_sale_name</event-sale-name>
<facilitated-auction-code>abc</facilitated-auction-code>
<floor-price>700</floor-price>
<listing-activated-timestamp>Tue May 24 21:38:09 +0000 2011</listing-activated-timestamp>
<manheim-group-code>mgc</manheim-group-code>
<physical-location>at_auction</physical-location>
<seller-id>5000000</seller-id>
<starting-bid-price>300</starting-bid-price>
<start-timestamp>Tue May 24 21:38:09 +0000 2011</start-timestamp>
<stock-number>3BBBDOC</stock-number>
<unique-bidder-count>1</unique-bidder-count>
<vehicle-detail-url>http://localhost/vdp/show/169</vehicle-detail-url>
<view-count>0</view-count>
<vin>12345678901234567</vin>
</listing-confirmation>
我有几个问题:
1 - 如何处理根XML消息中的破折号?会不会是这样的
[XmlRoot("listing-confirmation")]
public class Listing_confirmation
2 - 如何处理xml元素中的破折号?我会用这个
吗?[XmlElement("account-id")]
public int account_id { get; set; }
3 - 如何处理日期时间格式化?它会自动理解并将其转换为DateTime还是我需要做些什么来处理它?如果是这样,我该怎么做?
谢谢! 杰里米
编辑时间为10/1/2012 @ 4:56 EST
这是我的Listing_confirmation模型的新类文件
[DataContract(Name="listing-confirmation")]
public class Listing_confirmation
{
[DataMember(Name="account-id")]
public int account_id { get; set; }
[DataMember(Name="allow-bid")]
public bool allow_bid { get; set; }
[DataMember(Name="allow-both")]
public bool allow_both { get; set; }
[DataMember(Name="allow-buy")]
public bool allow_buy { get; set; }
[DataMember(Name="allow-offers")]
public bool allow_offers { get; set; }
[DataMember(Name="auction-work-order")]
public int? auction_work_order { get; set; }
[DataMember(Name="bid-count")]
public int? bid_count { get; set; }
[DataMember(Name="bid-increment")]
public int? bid_increment { get; set; }
[DataMember(Name="buyer-group-name")]
public string buyer_group_name { get; set; }
[DataMember(Name="buyer-group-type")]
public string buyer_group_type { get; set; }
[DataMember(Name="buy-now-price")]
public int buy_now_price { get; set; }
[DataMember(Name="condition-report-url")]
public string condition_report_url { get; set; }
[DataMember(Name="current-bid")]
public int? current_bid { get; set; }
//[DataMember(Name="end-timestamp")]
//public DateTime end_timestamp { get; set; }
[DataMember(Name="event-sale-id")]
public int? event_sale_id { get; set; }
[DataMember(Name="event-sale-name")]
public string event_sale_name { get; set; }
[DataMember(Name="facilitated-auction-code")]
public string facilitated_auction_code { get; set; }
[DataMember(Name="floor-price")]
public int floor_price { get; set; }
//[DataMember(Name="listing-activated-timestamp")]
//public DateTime listing_activated_timestamp { get; set; }
[DataMember(Name="manheim-group-code")]
public string manheim_group_code { get; set; }
//[DataMember(Name="message-triggered")]
//public DateTime message_triggered { get; set; }
[DataMember(Name="physical-location")]
public string physical_location { get; set; }
[DataMember(Name="seller-id")]
public int seller_id { get; set; }
[DataMember(Name="starting-bid-price")]
public int? starting_bid_price { get; set; }
//[DataMember(Name="start-timestamp")]
//public DateTime start_timestamp { get; set; }
[DataMember(Name="stock-number")]
public string stock_number { get; set; }
[DataMember(Name="unique-bidder-count")]
public int? unique_bidder_count { get; set; }
[DataMember(Name="vehicle-detail-url")]
public string vehicle_detail_url { get; set; }
[DataMember(Name="view-count")]
public int? view_count { get; set; }
[DataMember(Name="vin")]
public string vin { get; set; }
}
但是,它仍然没有正确绑定数据。当我调试控制器时,它总是具有ModelState.IsValid = false并且Listing_Confirmation对象始终为null。有人可以帮忙吗?
谢谢!
答案 0 :(得分:1)
来自How WebAPI does Parameter Binding Work:
绑定参数有两种技术:模型绑定和 格式化程序。实际上,WebAPI使用模型绑定来读取 查询字符串和格式化程序以从正文中读取。
如果您从第三方收到的XML是POST操作的主体,那么您应该编写一个自定义XML媒体格式化程序来执行模型绑定,该模型绑定将获取XML并返回表示数据的.NET对象被接受。
有关如何编写自定义媒体类型格式化程序的示例,请参阅Media Formatters。您需要使用自定义XML格式化程序替换默认的XML媒体类型格式化程序。
答案 1 :(得分:0)
我终于找到了问题所在。
1 - 在我的Application_Start()方法中,我添加了以下代码行来指定使用XmlSerializer而不是DataContract Serializer:
var xml = GlobalConfiguration.Configuration.Formatters.XmlFormatter;
xml.UseXmlSerializer = true;
2 - 我使用XmlRoot和XmlElement属性来修饰类名和每个属性。这是我的新类文件 -
[XmlRoot("listing-confirmation")]
public class Listing_confirmation
{
[XmlElement("account-id")]
public int account_id { get; set; }
[XmlElement("allow-bid")]
public bool allow_bid { get; set; }
[XmlElement("allow-both")]
public bool allow_both { get; set; }
[XmlElement("allow-buy")]
public bool allow_buy { get; set; }
[XmlElement("allow-offers")]
public bool allow_offers { get; set; }
[XmlElement("auction-work-order")]
public int auction_work_order { get; set; }
[XmlElement("bid-count")]
public int bid_count { get; set; }
[XmlElement("bid-increment")]
public int bid_increment { get; set; }
[XmlElement("buyer-group-name")]
public string buyer_group_name { get; set; }
[XmlElement("buyer-group-type")]
public string buyer_group_type { get; set; }
[XmlElement("buy-now-price")]
public int buy_now_price { get; set; }
[XmlElement("condition-report-url")]
public string condition_report_url { get; set; }
[XmlElement("current-bid")]
public int current_bid { get; set; }
//[XmlElement("end-timestamp")]
//public DateTime end_timestamp { get; set; }
[XmlElement("event-sale-id")]
public int event_sale_id { get; set; }
[XmlElement("event-sale-name")]
public string event_sale_name { get; set; }
[XmlElement("facilitated-auction-code")]
public string facilitated_auction_code { get; set; }
[XmlElement("floor-price")]
public int floor_price { get; set; }
//[XmlElement("listing-activated-timestamp")]
//public DateTime listing_activated_timestamp { get; set; }
[XmlElement("manheim-group-code")]
public string manheim_group_code { get; set; }
//[XmlElement("message-triggered")]
//public DateTime message_triggered { get; set; }
[XmlElement("physical-location")]
public string physical_location { get; set; }
[XmlElement("seller-id")]
public int seller_id { get; set; }
[XmlElement("starting-bid-price")]
public int starting_bid_price { get; set; }
//[XmlElement("start-timestamp")]
//public DateTime start_timestamp { get; set; }
[XmlElement("stock-number")]
public string stock_number { get; set; }
[XmlElement("unique-bidder-count")]
public int unique_bidder_count { get; set; }
[XmlElement("vehicle-detail-url")]
public string vehicle_detail_url { get; set; }
[XmlElement("view-count")]
public int view_count { get; set; }
[XmlElement("vin")]
public string vin { get; set; }
}
3 - 我必须注释掉所有的DateTime属性,因为它无法将传递的值转换为有效的DateTime。我仍在努力让它正常工作。
答案 2 :(得分:0)
我终于能够找出DateTime格式问题。这是我如何处理一个DateTime的示例。我同样对待其他人。
[XmlIgnore]
public DateTime? start_timestamp { get; set; }
[XmlElement("start-timestamp")]
public string start_timestampstring
{
get
{
return start_timestamp.HasValue ? start_timestamp.Value.ToString("ddd MMM dd HH:mm:ss zzz yyyy") : string.Empty;
}
set
{
if (!string.IsNullOrEmpty(value))
{
try
{
start_timestamp = DateTime.ParseExact(value, "ddd MMM dd HH:mm:ss zzz yyyy", System.Globalization.CultureInfo.InvariantCulture);
}
catch
{
start_timestamp = null;
}
}
else
{
start_timestamp = null;
}
}
}