2016-01-24 92 views
0

我使用GetAsync()调用外部服务并在查询字符串中传递参数。当我查看响应中的内容时,我没有看到任何返回的内容,但它返回200 OK,并在提琴手中正确返回了XML响应。我需要XML响应来反序列化为一个C#对象,然后再将其保存到数据库。ASP.Net Web APi C# - GetAsync不返回XML响应内容

事情尝试:

1)试过这种通过增加全球 - app_start()此设置,它并没有帮助

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true; 

2)创建一个对象,并试图通过GetAysnc给它发送,那也没有帮助。

public class Request 
    { 
     [XmlElement] 
     public string XML { get; set; } 
     [XmlElement] 
     public List<string> ProNumber { get; set; } 
    } 

2)我应该尝试在查询字符串中传递参数并期望json结果吗?如果我添加mediatyperformatter到application/json

这里是我的代码:

public async Task<HttpResponseMessage> GetData() 
{ 
    string requestString = "&xml=Y&PRONumber=82040X,03117X"; 
    string result = ""; 

    string url = @"http://my.yrc.com/dynamic/national/servlet?CONTROLLER=com.rdwy.ec.rextracking.http.controller.PublicTrailerHistoryAPIController"; 
    try 
    { 
     using (var client = new HttpClient()) 
     { 
      client.BaseAddress = new Uri(url); 
      client.DefaultRequestHeaders.Accept.Clear(); 
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml")); 

      HttpResponseMessage response = await client.GetAsync(url+requestString); 

      if (response.IsSuccessStatusCode) 
      { 
       return response; 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     result = ex.Message; 
    } 
    return null; 
} 

编辑:

     Shipments scp = null; 
         XmlRootAttribute xRoot = new XmlRootAttribute(); 
         xRoot.ElementName = "Shipment"; 
         xRoot.IsNullable = true; 
         XmlSerializer serializer = new XmlSerializer(typeof(Shipment), xRoot); 

        using (Stream stream = response.Content.ReadAsStreamAsync().Result) 
        { 
         scp = (Shipments)serializer.Deserialize(stream); 
        } 

型号:

public class Shipments 
    { 
     [XmlArrayItem(Type = typeof(Shipment))] 
     public Shipment[] Shipment; 
    } 

    public class Shipment 
    { 
     [XmlAttribute()] 
     public int returnCode { get; set; } 
     ................. 
     .............. 

四处错误:<SHIPMENTS xmlns=''> was not expected.

任何帮助,这是非常赞赏。

感谢, WH

+0

你可能在多个数据包获取数据和200的响应是最后一个包。验证小提琴手数据是否在先前的数据包中。如果您仍然遇到问题,请使用IE并手动转到URL并使用fiddler捕获结果,并与您的C#应用​​程序进行比较。 – jdweng

+1

适合我。你用'response.Content'做什么?您需要调用'ReadAsStreamAsync'或其他方法之一, –

+0

@ CharlesMager-试过但得到错误 解除序列化XML的错误:{“不是预期的。”} – Kanchana

回答

0

这为我工作 -

var client = new HttpClient(); 
var data = client.GetStringAsync("http://my.yrc.com/dynamic/national/servlet?CONTROLLER=com.rdwy.ec.rextracking.http.controller.PublicTrailerHistoryAPIController&xml=Y&PRONumber=82040X,03117X").Result; 
var ser = new XmlSerializer(typeof(Shipments)); 
var t = (Shipments)ser.Deserialize(new StringReader(data)); 


public class Shipment 
{ 
    public string returnCode { get; set; } 
    public string returnMessage { get; set; } 
    public string freightBillNumber { get; set; } 
    //props 
} 

[XmlRoot(ElementName = "SHIPMENTS")] 
public class Shipments 
{ 
    [XmlElement(ElementName = "SHIPMENT")] 
    public List<Shipment> SHIPMENT { get; set; } 
} 

编辑

这个作品,以及 -

var data = client.GetStreamAsync("http://my.yrc.com/dynamic/national/servlet?CONTROLLER=com.rdwy.ec.rextracking.http.controller.PublicTrailerHistoryAPIController&xml=Y&PRONumber=82040X,03117X").Result; 

编辑

作品,以及 -

var client = new HttpClient(); 
var data = client.GetAsync("http://my.yrc.com/dynamic/national/servlet?CONTROLLER=com.rdwy.ec.rextracking.http.controller.PublicTrailerHistoryAPIController&xml=Y&PRONumber=82040X,03117X").Result; 

var ser = new XmlSerializer(typeof(Shipments)); 
var t = (Shipments)ser.Deserialize(data.Content.ReadAsStreamAsync().Result); 
+0

它有效,但为什么我们应该以字符串的形式获取响应(xml),而不是使用读取响应的ReadAsStreamAsync(),一次一行 – Kanchana