如何在我的请求XML中包含序言?

时间:2013-08-08 13:45:29

标签: c# xml xml-serialization

我正在使用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加入该行?

2 个答案:

答案 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设置为不省略序言就可以了。