Si está dispuesto a decorar su modelo con XmlRoot, esta es una buena manera de hacerlo. Supongamos que tienes un auto con puertas. La configuración WebAPI por defecto devolverá algo como:
<car
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<doors>
<door>
<color>black</color>
</door>
</doors>
</car>
Esto es lo que quiere:
<car>
<doors>
<door>
<color>black</color>
</door>
</doors>
</car>
Aquí es el modelo:
[XmlRoot("car")]
public class Car
{
[XmlArray("doors"), XmlArrayItem("door")]
public Door[] Doors { get; set; }
}
Lo que tienes que hacer es crear un XmlFormatter personalizada que tendrá un espacio de nombres vacío si no hay espacios de nombres definidos en el atributo XmlRoot. Por algún motivo, el formateador predeterminado siempre agrega los dos espacios de nombres predeterminados.
public class CustomNamespaceXmlFormatter : XmlMediaTypeFormatter
{
public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content,
TransportContext transportContext)
{
try
{
var xns = new XmlSerializerNamespaces();
foreach (var attribute in type.GetCustomAttributes(true))
{
var xmlRootAttribute = attribute as XmlRootAttribute;
if (xmlRootAttribute != null)
{
xns.Add(string.Empty, xmlRootAttribute.Namespace);
}
}
if (xns.Count == 0)
{
xns.Add(string.Empty, string.Empty);
}
var task = Task.Factory.StartNew(() =>
{
var serializer = new XmlSerializer(type);
serializer.Serialize(writeStream, value, xns);
});
return task;
}
catch (Exception)
{
return base.WriteToStreamAsync(type, value, writeStream, content, transportContext);
}
}
}
Lo último que se debe hacer es agregar el nuevo formateador en WebApiContext. Asegúrese de eliminar (o borrar) el antiguo XmlMediaTypeFormatter
public static class WebApiContext
{
public static void Register(HttpConfiguration config)
{
...
config.Formatters.Clear();
config.Formatters.Add(new CustomNamespaceXmlFormatter{UseXmlSerializer=true});
...
}
}
Usted podría intentar algo como esto: http: // stackoverflow.com/questions/29352015/how-can-i-create-custom-xml-namespace-attributes-when-consuming-a-legacy-soap-se –