用于ApiController特定方法

时间:2016-09-01 10:33:44

标签: c# serialization asp.net-web-api mediatypeformatter

我有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

2 个答案:

答案 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);
        }
    }
希望这可以节省你一些时间。