我正在使用ObjectContent
来构建XML请求,如下所示:
private HttpRequestMessage CreateRequest<T>(T content, HttpMethod method) where T : class
{
// create http message request
var request = CreateRequest(method);
// set contents of the HTTP message
var xmlFormatter = new XmlMediaTypeFormatter
{
Indent = true,
UseXmlSerializer = true
};
var objectContent = new ObjectContent<T>(content, xmlFormatter);
request.Content = objectContent;
// return HttpRequestMessage
return request;
}
这很好用!但是,输出不包括XML前导码,例如
<?xml version="1.0" encoding="UTF-8"?>
如何鼓励XmlSerializer
加入该行?
答案 0 :(得分:2)
我无法弄清楚如何使用ObjectContent
执行此操作,因此我先将其序列化,然后通过StreamContent
将其传递给请求:
private HttpRequestMessage CreateRequest<T>(T content, HttpMethod method) where T : class
{
var request = CreateRequest(method);
var encoding = Encoding.UTF8;
var xmlWriterSettings = new XmlWriterSettings { Indent = true, Encoding = encoding };
// StringWriterWithEncoding courtesy of http://stackoverflow.com/a/9459212/29
using (var stringWriter = new StringWriterWithEncoding(encoding))
using (var xmlWriter = XmlWriter.Create(stringWriter, xmlWriterSettings))
{
var xmlSerializer = new XmlSerializer(typeof(T));
xmlSerializer.Serialize(xmlWriter, content);
request.Content = new StringContent(stringWriter.ToString(), encoding);
}
return request;
}
答案 1 :(得分:1)
你的旧解决方案非常接近,做得不错。
可以在覆盖类中的设置上更改OmitXmlDeclaration,如此
public class CustomXmlMediaTypeFormatter : XmlMediaTypeFormatter
{
public CustomXmlMediaTypeFormatter()
{
UseXmlSerializer = true;
WriterSettings.OmitXmlDeclaration = false;
}
}
我花了一段时间才弄明白,但是人们应该知道,只要将WriterSettings设置为不省略序言就可以了。