【问题标题】:Xml Request and response from a URL来自 URL 的 XML 请求和响应
【发布时间】:2021-04-05 08:07:55
【问题描述】:

我正在尝试从接受 Xml 输入并返回 Xml 输出的 URL 获取响应。

当这个 Url 返回错误请求 400 时,会出现这种情况,在这种情况下,在代码中我会得到一个异常并且我无法查看 Xml,但是如果我在邮递员中尝试相同的输入,我会得到Xml 输出。

如果出现异常,我可以使用 WebException 捕获此异常,但最后我使用 reader 读取响应时。 ReadToEnd()我会得到一个 JSON 而不是我从邮递员那里得到的 Xml 输出

邮递员输出示例:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<RESPONSE MODE="DIRECT" TYPE="PINPRINTING">
    <RESULTMESSAGE>User not allowed to process</RESULTMESSAGE>
</RESPONSE>

这是我的代码:

public void GetResponse()
        {
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(myURL);
                request.Accept = "application/xml";

                byte[] requestInFormOfBytes = System.Text.Encoding.ASCII.GetBytes(requestXmlDoc.InnerXml);
                request.Method = "POST";
                request.ContentType = "text/xml;charset=utf-8";
                request.ContentLength = requestInFormOfBytes.Length;
                Stream requestStream = request.GetRequestStream();

                requestStream.Write(requestInFormOfBytes, 0, requestInFormOfBytes.Length);
                requestStream.Close();

                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                StreamReader respStream = new StreamReader(response.GetResponseStream(), System.Text.Encoding.Default);
                string receivedResponse = respStream.ReadToEnd();
            }
            catch (WebException e)
            {
                using (WebResponse response = e.Response)
                {
                    HttpWebResponse httpResponse = (HttpWebResponse)response;
                    Console.WriteLine("Error code: {0}", httpResponse.StatusCode);
                    using (Stream data = response.GetResponseStream())
                    using (var reader = new StreamReader(data, ASCIIEncoding.ASCII))
                    {
                        string text = reader.ReadToEnd();

                        Console.WriteLine(text);
                    }
                }
            }
        }

返回的 JSON 是这样的:

{
  "status": 400,
  "statusDesc": "Invalid input"
}

【问题讨论】:

  • 数据必须使用 TLS 加密才能看到请求。使用 HTTPS 时会自动使用 TLS。

标签: c# xml httpwebrequest


【解决方案1】:

嘿,我找到了答案,它是内容类型。 改变: request.ContentType = "text/xml;charset=utf-8"; 对此 request.ContentType = "应用程序/xml"; 现在我得到了我需要的 Xml

【讨论】:

  • 对于带有StringContent 的简单HttpClient.PostAsync 来说,代码太多了。使用 7 位 ASCII 而不是 UTF8 是另一个严重的错误。自 2002 年以来,.NET 就支持基于 HTTP 的 XML——事实上 SOAP,即 XML Web 服务标准,是由 Microsoft 创建的。 .NET 通过 WCF 支持所有 SOAP 标准。
  • 即使使用旧的 HttpWebRequest 类,代码也太多了。到目前为止,HttpWebRequest 只是 HttpClient 的一个遗留外观
  • 这个Url是用于外部集成而不是我们的Api,但可以进一步最小化这段代码吗?
  • Check this question。相关代码只有两行。
猜你喜欢
  • 1970-01-01
  • 2021-09-15
  • 2017-11-08
  • 1970-01-01
  • 1970-01-01
  • 2018-08-01
  • 2019-08-10
  • 2012-01-08
  • 2017-09-26
相关资源
最近更新 更多