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