解码输入流

23

我有一个页面通过POST方法接受XML。这是一小段代码:

if (Request.ContentType != "text/xml")
        throw new HttpException(500, "Unexpected Content Type");

StreamReader stream = new StreamReader(Request.InputStream);
string x = stream.ReadToEnd();  // added to view content of input stream

XDocument xmlInput = XDocument.Load(stream);

我遇到了一个错误,于是我将流转换为字符串,仅仅是为了检查是否所有内容都被正确发送。当我查看内容时,看起来像这样:

%3c%3fxml+version%3d%271.0%27+encoding%3d%27UTF-8%27%3f%3e%0d%0a

所以我想我需要对流进行解码。唯一的问题是我不知道如何在流上使用 HtmlDecode,并仍然将其保留为 StreamReader 对象。

有没有办法做到这一点?


看起来XML已经被编码了一次,而不仅仅是包含XML。是什么在发布数据,它应该做什么? - Jon Skeet
看起来它不是HTML编码,而是URL编码的字符串。主要问题是为什么?您是否控制发布XML的站点? - Sergei B.
@invisible - 不,我不控制发布XML的那一方。 - Steven
可能是应用程序/表单-URL编码吗? - sisve
1个回答

33

显然客户端发送的内容是URL编码的XML。因此,您需要像这样解码内容:

StreamReader stream = new StreamReader(Request.InputStream);
string x = stream.ReadToEnd();
string xml = HttpUtility.UrlDecode(x);

XDocument xmlInput = XDocument.LoadXml(xml);

无论如何,问题很可能在客户端...为什么要以这种方式对XML进行编码?


1
@Jcorretjer,我在我的答案中提出的建议仅适用于OP的用例。在任意文件上传上使用这个是没有意义的。 - Thomas Levesque
1
请小心使用StreamReader,它继承自TextReader,而TextReader又继承自IDisposable,因此必须进行Dispose或在Using语句中使用。 - Alex

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