【问题标题】:ASP.Net Web APi C# - GetAsync not returning XML response contentASP.Net Web APi C# - GetAsync 不返回 XML 响应内容
【发布时间】:2016-01-24 16:50:03
【问题描述】:

我正在使用GetAsync() 调用外部服务并在查询字符串中传递参数。当我检查响应中的内容时,我没有看到任何返回,但是它返回 200 OK 并且在提琴手中它正确地返回了 XML 响应。我需要 XML 响应来反序列化为 C# 对象,然后将其进一步保存到 DB。

尝试过的事情:

1) 尝试在 global-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; }
        .................
        ..............

出现错误:&lt;SHIPMENTS xmlns=''&gt; was not expected.

非常感谢您对此的任何帮助。

谢谢, WH

【问题讨论】:

  • 您可能在多个数据包中获取数据,而 200 响应是最后一个数据包。在提琴手中验证数据是否在前一个数据包中。如果您仍然遇到问题,请使用 IE 并手动转到 URL 并使用 fiddler 捕获结果并与您的 C# 应用程序进行比较。
  • 对我来说很好。你在用response.Content 做什么?您需要拨打ReadAsStreamAsync或其他方法之一,
  • @CharlesMager- 尝试但收到错误反序列化 XML 错误:{“ 不是预期的。”}

标签: c# xml web-services asp.net-web-api httpclient


【解决方案1】:

这对我有用 -

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);

【讨论】:

  • 它有效,但是为什么我们应该将响应(此处的xml)作为字符串而不是使用读取响应的ReadAsStreamAsync(),一次一行
猜你喜欢
  • 1970-01-01
  • 2013-01-14
  • 2018-07-09
  • 2013-11-03
  • 2015-08-17
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多