我想使用DataContractSerializer
来序列化响应,并使用XmlSerializer
来反序列化传入请求中的xml。可能吗?我知道我可以为不同的类型使用不同的序列化器,但我想要不同的序列化器进行读写。
答案 0 :(得分:3)
这似乎是一个非常奇怪的要求,但是是的,这是可能的。您可以创建这样的自定义MediaType格式化程序:
public class DcsXsFormatter : MediaTypeFormatter
{
public DataContractXmlFormatter()
{
SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("application/xml"));
SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("text/xml"));
}
public override bool CanWriteType(Type type)
{
return true;
}
public override bool CanReadType(Type type)
{
return true;
}
public override Task<object> ReadFromStreamAsync(Type type, Stream readStream,
HttpContent content,
IFormatterLogger formatterLogger)
{
var task = Task<object>.Factory.StartNew(() =>
{
var ser = new XmlSerializer(type);
return ser.Deserialize(readStream);
});
return task;
}
public override Task WriteToStreamAsync(Type type, object value,
Stream writeStream,
HttpContent content,
TransportContext transportContext)
{
var task = Task.Factory.StartNew( () =>
{
var ser = new DataContractSerializer(type);
ser.WriteObject(writeStream,value);
writeStream.Flush();
});
return task;
}
}
将其连接到global.asax:
//删除现有的XmlFormatter config.Formatters.Remove(config.Formatters.XmlFormatter);
// Hook in your custom XmlFormatter
config.Formatters.Insert(0, new DcsXsFormatter());
但你为什么要这样做?