Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在请求XML中包含序言?_C#_Xml_Xml Serialization - Fatal编程技术网

C# 如何在请求XML中包含序言?

C# 如何在请求XML中包含序言?,c#,xml,xml-serialization,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

我使用
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;
}
私有HttpRequestMessage CreateRequest(T内容,HttpMethod方法),其中T:class
{
//创建http消息请求
var-request=CreateRequest(方法);
//设置HTTP消息的内容
var xmlFormatter=新的XmlMediaTypeFormatter
{
缩进=真,
UseXmlSerializer=true
};
var objectContent=新的objectContent(content,xmlFormatter);
request.Content=objectContent;
//返回HttpRequestMessage
返回请求;
}
这很有效!但是,输出不包括XML前导,例如

<?xml version="1.0" encoding="UTF-8"?>


我如何鼓励
XmlSerializer
包含该行?

我不知道如何使用
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;
}
私有HttpRequestMessage CreateRequest(T内容,HttpMethod方法),其中T:class
{
var-request=CreateRequest(方法);
var encoding=encoding.UTF8;
var xmlWriterSettings=new xmlWriterSettings{Indent=true,Encoding=Encoding};
//StringWriterWithEncoding由http://stackoverflow.com/a/9459212/29
使用(var stringWriter=new StringWriterWithEncoding(encoding))
使用(var xmlWriter=xmlWriter.Create(stringWriter,xmlWriterSettings))
{
var xmlSerializer=新的xmlSerializer(typeof(T));
序列化(xmlWriter,内容);
request.Content=新的StringContent(stringWriter.ToString(),编码);
}
返回请求;
}

您的旧解决方案非常接近正确的解决方案

可以在重写类内更改设置的OmitXmlDeclaration,如下所示

    public class CustomXmlMediaTypeFormatter : XmlMediaTypeFormatter
    {
        public CustomXmlMediaTypeFormatter()
        {
            UseXmlSerializer = true;
            WriterSettings.OmitXmlDeclaration = false;
        }
    }

我也花了一段时间才弄明白,但人们应该知道,只要将WriterSettings设置为不省略序言,这是可能的。

如果它工作正常,那么为什么需要XMlDeclaration?不幸的是,我调用的服务需要它:/我正处于完全相同的情况,简直不敢相信序言/声明中没有默认的强制方式。很好!
ommitXMLDeclaration
属性上的注释具有误导性:
//返回:true以省略XML声明;否则,错误。默认值为false,将写入XML声明。
。当
UseXmlSerializer=true