Nếu bạn sẵn sàng trang trí cho mô hình của mình bằng XmlRoot, đây là cách hay để thực hiện. Giả sử bạn có một chiếc xe có cửa ra vào. Cấu hình WebAPI mặc định sẽ trở lại một cái gì đó như:
<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>
Đây là những gì bạn muốn:
<car>
<doors>
<door>
<color>black</color>
</door>
</doors>
</car>
Dưới đây là mô hình:
[XmlRoot("car")]
public class Car
{
[XmlArray("doors"), XmlArrayItem("door")]
public Door[] Doors { get; set; }
}
Những gì bạn phải làm là tạo ra một XmlFormatter tùy chỉnh sẽ có một không gian tên trống nếu không có không gian tên được định nghĩa trong thuộc tính XmlRoot. Vì một số lý do, trình định dạng mặc định luôn thêm hai không gian tên mặc định.
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);
}
}
}
Điều cuối cùng cần làm là thêm trình định dạng mới trong WebApiContext. Hãy chắc chắn xóa (hoặc xóa) XmlMediaTypeFormatter cũ
public static class WebApiContext
{
public static void Register(HttpConfiguration config)
{
...
config.Formatters.Clear();
config.Formatters.Add(new CustomNamespaceXmlFormatter{UseXmlSerializer=true});
...
}
}
Bạn có thể thử một cái gì đó như thế này: http: // stackoverflow.com/questions/29352015/how-can-i-create-custom-xml-namespace-attributes-khi-tiêu thụ-a-legacy-soap-se –