我有ApiController
,其中一种方法需要自定义序列化。
public async Task<Session> PostSession([FromBody] Session session)
有大量的Session对象可以容纳所有内容,而且消费者不希望得到超过一半的内容,通常我可以用[XmlIgnore()]
来装饰属性并完成,但是这个对象在内部通过许多API传递并删除这些将破坏这些机制。
另一个解决方案是将该对象替换为CastratedSession
之类的不同对象并返回该对象。我不能这样做,因为现有的第三方API调用相同的端点,期望得到Session
,或者他们必须重写他们的东西(不会发生)。
然后我建议创建一个第三方可以调用的不同端点 - 但是架构师反对并说要根据他们将在标题中设置的特定MediaTypeFormatter
值来执行自定义content-type
,问题是我们已经在同一控制器中使用自定义MediaTypeFormatter
,我开箱即用的方式只能在每个控制器的配置中设置它们
public static void ConfigureApis(HttpConfiguration config)
{
config.Formatters.Add(new CustomJsonFormatter());
config.Formatters.Add(new CustomXmlFormatter());
}
哪种方式将我描绘到角落里。
如何(可以)在ApiController上为每个方法设置自定义MediaTypeFormatter
?
答案 0 :(得分:0)
您可以编写自定义操作过滤器,覆盖OnActionExecuting
方法以检查目标操作,然后将适当的格式化程序添加到配置中。
internal class DecisionMakingFilter : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
var actionName= actionContext.ActionDescriptor.ActionName;
if(actionName == "Some Foo")
{
actionContext.RequestContext.Configuration.Formatters.Add(new CustomMediaFormatter());
}
base.OnActionExecuting(actionContext);
actionContext.RequestContext.Configuration.Formatters.Remove(new CustomMediaFormatter());
}
}
答案 1 :(得分:0)
自己想出了一个解决方法
我使用CustomXmlFormatter()
EvenMoreCustomXmlFormatter()
然后在WriteToStreamAsync
做了这个:
public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content, TransportContext transportContext)
{
if (content.Headers.ContentType.MediaType == "text/sessionXml") // this was agreed with 3rd party
{
//do my serialization stuff
}
else
{
return base.WriteToStreamAsync(type, value, writeStream, content, transportContext);
}
}
希望这可以节省你一些时间。