正文的帖子有几种不同的 XML 传入。所有 XMLS 几乎都是相同的,因此我首先添加一个基类,其他 XMLS 继承自该基类。
这是模型:
[XmlInclude(typeof(TextMsg))]
[XmlRoot("xml")]
public class BaseClass
{
public string ToUserName { get; set; }
public string FromUserName { get; set; }
public string CreateTime { get; set; }
public string MsgType { get; set; }
}
[XmlRoot("xml")]
public class TextMsg : BaseClass
{
public TextMsg()
{
MsgType = "text";
}
public string Content { get; set; }
public string MsgId { get; set; }
}
还有几个类继承自基类模型,现在我在这里只展示一个。
这是方法:
[HttpPost]
[Produces("application/xml")]
public async Task<IActionResult> mp([FromBody]BaseClass XmlData)
{
BaseClass ReturnXmlData = null;
var a = XmlData.GetType();
return Ok(ReturnXmlData);
}
远程服务器将向我的服务器发送包含 XML 的请求。现在传入变量XmlData
只获取基类的值和类型。
我需要获取真实的值和类型,然后通过传入的类型和值返回不同的XML。
我该如何解决这个问题?谢谢。
这是传入的 XML 之一,与上面的 TextMsg 模型匹配:
<xml>
<ToUserName>123</ToUserName>
<FromUserName>456</FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType>text</MsgType>
<Content>this is a test</Content>
<MsgId>1234567890123456</MsgId>
</xml>
您可以为此创建一个自定义模型绑定器
public class XmlBinder : IModelBinder
{
public async Task BindModelAsync(ModelBindingContext bindingContext)
{
try
{
var memoryStream = new MemoryStream();
await bindingContext.HttpContext.Request.Body.CopyToAsync(memoryStream);
memoryStream.Seek(0, SeekOrigin.Begin);
XElement root = XElement.Load(memoryStream);
memoryStream.Seek(0, SeekOrigin.Begin);
string messageType = root.Element("MsgType").Value;
Type xmlType = GetTypeFromMessage(messageType);
var serializer = new XmlSerializer(xmlType);
var model = serializer.Deserialize(memoryStream);
bindingContext.Result = ModelBindingResult.Success(model);
}
catch
{
bindingContext.Result = ModelBindingResult.Failed();
}
}
private Type GetTypeFromMessage(string msgType)
{
switch (msgType)
{
case "text":
return typeof(TextMsg);
case "image":
return typeof(ImageMsg);
//... other cases
default:
return typeof(BaseClass);
}
}
}
将此模型活页夹应用于BaseClass
[ModelBinder(typeof(XmlBinder))]
public class BaseXml
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)