使用ProtoBuf将字符串列表发送到Web Api

时间:2015-01-14 07:51:34

标签: asp.net-web-api protobuf-net

我想以protobuf格式向WebApi服务发送List(Of String)。 我尝试了下面的解决方案,但数据对象是Nothing。 如何设置ByteArray的属性名称,还是可以使用FormUrlEncodedContent?

我错了什么?

我在互联网上搜索但我找不到正确的解决方案。 我希望我的问题很明确。

Dim articleList As List(Of String)
articleList.Add("134545454") 
Using client As New HttpClient()
  client.BaseAddress = New Uri(WEB_URL)
  client.DefaultRequestHeaders.Accept.Add(New MediaTypeWithQualityHeaderValue("application/x-protobuf"))
  Dim stream As MemoryStream = New MemoryStream
  ProtoBuf.Serializer.Serialize(Of List(Of String))(stream, articleList)
  stream.Seek(0, SeekOrigin.Begin)
  Dim data As New ByteArrayContent(stream.ToArray)
  data.Headers.Add("ContentType", "application/x-protobuf")
  Dim response = client.PostAsync("MutatieLijst", data).Result

Webapi致电:

<HttpPost()>
Public Function GetArtikelMutatieLijst(ByVal data As List(Of String)) As List(Of ArtikelUpdate)
End Function

1 个答案:

答案 0 :(得分:1)

Web API基于媒体格式化来解析和格式化值。但是Web APi只包括以下格式化程序:XML,JSON,BSON和form-urlencoded。

如果您希望以与Content-TypeAccept标题相同的格式发送和接收数据,则需要实现自己的格式化程序。

这里有两个实现媒体格式的示例,但是如果你谷歌搜索“Web APi自定义媒体格式化程序”,你可以获得更多:

基本上,你需要:

  • MediaTypeFormatterBufferedMediaTypeFormatter派生一个类(用于异步或同步实现)
    • 在构造函数中包含受支持的MIME类型
    • 实施CanWriteTypeCanreadTypeWriteToStreamReadFromStream
  • 在Web API配置中注册媒体格式化程序类

考虑到将使用格式化程序:

  • Content-Type标题
  • 中指定媒体格式时解析收到的数据
  • 在使用Accept标题
  • 指定媒体格式时序列化返回的对象