【问题标题】:Controlling serialization in Web API / APIController在 Web API / APIController 中控制序列化
【发布时间】:2013-01-03 18:40:12
【问题描述】:

在哪里可以在 ASP.NET Web API 中指定自定义序列化/反序列化?

我们的应用程序的吞吐量需要消息的快速序列化/反序列化,因此我们需要严格控制这部分代码以使用我们的自制软件或 OSS。

我已经检查了各种来源,例如 this,它解释了如何创建自定义值提供者,但我还没有看到一个例子来解释端到端的过程。

谁能指导/告诉我序列化传入/传出消息的方法?

还可以提供类似于this one for WCF 的 Web API 中各种注入点/事件接收器的图表!

【问题讨论】:

  • 实现ISerializable?
  • 嗯...不,这似乎是 WCF 的做事方式。

标签: asp.net serialization asp.net-web-api deserialization


【解决方案1】:

您正在寻找的扩展点是 MediaTypeFormatter。它控制从请求正文读取和写入响应正文。这可能是编写自己的格式化程序的最佳资源:

http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters

【讨论】:

  • 看起来就是这样,虽然每个主机似乎只有一个序列化程序,有没有办法在控制器/动作级别配置这个序列化程序?
  • 可以做到。有几种方法可以处理这个问题:1)您可以在创建响应时明确说明要使用的格式化程序。您可以使用 Request.CreateResponse 扩展方法来选择要使用的格式化程序。或者 2) 您可以使用每个控制器的配置来自定义特定控制器的格式化程序。
  • 这是另一个关于 WebAPI 可扩展性的好文档:asp.net/web-api/overview/extensibility/…。特别是,它解释了我刚才提到的每个控制器的配置。
【解决方案2】:

这是上面答案中的链接失效的代码示例

public class MerlinStringMediaTypeFormatter : MediaTypeFormatter
{
    public MerlinStringMediaTypeFormatter()
    {
        SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/plain"));
    }

    public override bool CanReadType(Type type)
    {
        return type == typeof (YourObject); //can it deserialize
    }

    public override bool CanWriteType(Type type)
    {
        return type == typeof (YourObject); //can it serialize
    }

    public override Task<object> ReadFromStreamAsync( 
        Type type, 
        Stream readStream, 
        HttpContent content, 
        IFormatterLogger formatterLogger)
    {
        //Here you put deserialization mechanism
        return Task<object>.Factory.StartNew(() => content.ReadAsStringAsync().Result);
    }

    public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content, TransportContext transportContext)
    {
        //Here you would put serialization mechanism
        return base.WriteToStreamAsync(type, value, writeStream, content, transportContext);
    }
}

然后你需要在Global.asax注册你的格式化程序

protected void Application_Start()
    {
        config.Formatters.Add(new MerlinStringMediaTypeFormatter());
    }

希望这可以为您节省一些时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 2014-05-24
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 2021-05-04
    • 2014-07-07
    相关资源
    最近更新 更多