使用HttpClient从WebAPI消费xml

6
我使用WebClient从restful服务(.net web api)获取Xml对象,一切都很顺利:
using(WebClient client = new WebClient())
{
   client.Encoding = UTF8Encoding.UTF8;
   client.Headers[HttpRequestHeader.ContentType] = "text/xml";
   client.Credentials = // ....;
   xmlResult = webClient.DownloadString(url);
}

....

这段代码运行得很好,我得到了一个Xml字符串作为返回值,大家都很满意。

现在,我对代码进行了更改,让它使用HttpClient,但我无法获得一个Xml返回值 - 总是返回一个Json字符串。

using(var handler = new HttpClientHandler() {Credentials = new NetworkCredentials})
using(var client = new HttpClient(handler))
{
   var request = new HttpRequestMessage(HttpMethod.Get, url);
   request.Headers.Add(HttpRequestHeader.ContentType.ToString(), "text/xml");
   returnedXml = client.SendAsync(request).Result.Content.ReadAsStringAsync().Result;
}   

我做错了什么?我怎样才能获得我所渴望的Xml文件呢?
谢谢。
3个回答

6

试试这个方法吧...

using(var handler = new HttpClientHandler() {Credentials = new NetworkCredentials})
using(var client = new HttpClient(handler))
{
      client.DefaultRequestHeaders
      .Accept
      .Add(new MediaTypeWithQualityHeaderValue("text/xml"));
   var request = new HttpRequestMessage(HttpMethod.Get, url);
    returnedXml = client.SendAsync(request).Result.Content.ReadAsStringAsync().Result;
}  

如果你已经设置了BaseAddress,并想通过GetAsync("/")执行操作,但它无法工作,那么你需要在GetAsync中指定URL。lol - sunnamed

2

问题解决了!

我应该添加一个“Accept”头部,其类型应为“application/xml”。

完整的工作版本:

using(var handler = new HttpClientHandler() {Credentials = new NetworkCredentials})
using(var client = new HttpClient(handler))
{
  var request = new HttpRequestMessage(HttpMethod.Get, url);
  request.Headers.Add(HttpRequestHeader.Accept.ToString(), "application/xml");
  returnedXml = client.SendAsync(request).Result.Content.ReadAsStringAsync().Result;
}   

0

这是现有答案的重构版本。

using var client = new HttpClient();
client
    .DefaultRequestHeaders
    .Accept.Add(new MediaTypeWithQualityHeaderValue(MediaTypeNames.Text.Xml));
client.Timeout = TimeSpan.FromSeconds(500);
var response = await client.GetAsync("Put your URL right here!");
if (response.IsSuccessStatusCode)
{
    var responseContent = await response.Content.ReadAsStringAsync();
    if (string.IsNullOrWhiteSpace(responseContent) == false)
// etc etc etc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接