Se sei disposto a decorare il tuo modello con XmlRoot, ecco un bel modo per farlo. Supponi di avere una macchina con le porte. La configurazione di default WebAPI tornerà qualcosa di simile:
<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>
Questo è ciò che si vuole:
<car>
<doors>
<door>
<color>black</color>
</door>
</doors>
</car>
Ecco il modello:
[XmlRoot("car")]
public class Car
{
[XmlArray("doors"), XmlArrayItem("door")]
public Door[] Doors { get; set; }
}
Quello che devi fare è creare un XmlFormatter personalizzato che avrà uno spazio dei nomi vuoto se non ci sono spazi dei nomi definiti nell'attributo XmlRoot. Per qualche ragione, il formattatore predefinito aggiunge sempre i due spazi dei nomi predefiniti.
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);
}
}
}
L'ultima cosa da fare è aggiungere il nuovo formattatore in WebApiContext. Assicurati di rimuovere (o cancellare) il vecchio XmlMediaTypeFormatter
public static class WebApiContext
{
public static void Register(HttpConfiguration config)
{
...
config.Formatters.Clear();
config.Formatters.Add(new CustomNamespaceXmlFormatter{UseXmlSerializer=true});
...
}
}
Si potrebbe provare qualcosa di simile: http: // StackOverflow.it/questions/29352015/how-can-i-create-custom-xml-namespace-attributes-when-consuming-a-legacy-soap-se –