gpt4 book ai didi

c# - 使用自定义 XmlMediaTypeFormatter 删除 web api 响应中的所有命名空间 c# .net

转载 作者:行者123 更新时间:2023-12-04 17:02:14 24 4
gpt4 key购买 nike

我在尝试删除 XML Web Api 响应中的所有命名空间时遇到问题。特别是我在删除嵌套/子命名空间时遇到了麻烦。我将从一些背景开始。
我有很多模型类,我用它们装饰过

[XmlRoot("someRoot", Namespace = "someNameSpace")]

这些类中的任何一个都没有其他装饰,只有 XmlRoots,也许这不是嵌套方法?

无论如何,

我通过阅读这里不同形式的一些答案,实现了我自己的自定义 XmlMediaTypeFormatter。
实现如下(来自 Remove namespace in XML from ASP.NET Web API)
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);
}
}
}

我还在我的 WebApiConfig.cs 中将其注册为:
GlobalConfiguration.Configuration.Formatters.Add(new CustomNamespaceXmlFormatter());

GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);

现在我的问题是命名空间被删除了,但有一些奇怪的行为,因为它们现在被添加到他们的 child ......

例如,没有自定义格式化程序我的 xml 看起来像
<d2p1:MyClass xmlns:d3p1="http://schemas.datacontract.org/2004/07/MyClass">
<d3p1:ChildNodeOfMyClass>

但是当使用我的 CustomNamespaceXmlFormatter 时,我会得到
<MyClass>
<ChildNodeOfMyClass xmlns="http://schemas.datacontract.org/2004/07/MyClass">

这种行为贯穿我的整个响应过程。关于为什么会发生这种情况的任何想法?

作为旁注,我想补充一点,我使用 XmlRoot 的原因是因为我的一些类包含具有相同类名的公共(public)属性,并且需要这样的公共(public)属性,以便在序列化我的响应时不会发生冲突。

任何有关如何处理此问题的帮助/指导将不胜感激,谢谢 =)

最佳答案

对于其他想要做类似事情的人,我想出了一种可能的解决方案。这需要您将 Newtonsoft.Json 作为引用,以便执行 JsonConvert.DeserializeXmlNode()。如果您有多个 JSON 根元素,则此函数的第二个参数是根节点的名称。

此方法实现的引用:http://techqa.info/programming/question/17526299/Right-way-of-implementing-MediaTypeFormatter-WriteToStreamAsync-in-Web-API

public class CustomNamespaceXmlFormatter : XmlMediaTypeFormatter
{

public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content,
TransportContext transportContext)
{
try
{
XmlDocument doc = JsonConvert.DeserializeXmlNode(value.ToString(), "myRootElement");
doc.LoadXml(doc.InnerXml);
doc.Save(writeStream);
var tcs = new TaskCompletionSource<object>();
tcs.SetResult(null);
return tcs.Task;
}
catch (Exception)
{
return base.WriteToStreamAsync(type, value, writeStream, content, transportContext);
}
}
}

关于c# - 使用自定义 XmlMediaTypeFormatter 删除 web api 响应中的所有命名空间 c# .net,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45180522/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com