如何在webapi中处理具有表单编码主体的DELETE?

时间:2017-10-29 19:33:45

标签: c# asp.net-web-api datatables

客户端正在使用DataTables来实现UI。我正在构建一个C#WebApi后端(适用于IIS / Azure的完整.NET框架)。在大多数情况下,事情排成一行 - 主要是json请求,除了一个案例。前端想要删除一批记录,并使用application / x-www-form-urlencoded正文将请求表示为HTTP DELETE,其中包含标识要删除的记录的信息。 WebApi应该能够处理表单编码,但在这种情况下,ApiController方法似乎没有任何可用的主体。 FWIW,原始请求主体的样本如下所示:

  

行动=删除&安培;数据%5B4%5D%5BID%5D = 4和;数据%5B4%5D%5BCDID%5D = 1&安培;数据%5B4%5D%5BTitle%5D =白色+狼&安培;数据%5B4%5D %5BLengthSeconds%5D = 215安培;数据%5B5%5D%5BID%5D = 5&安培;数据%5B5%5D%5BCDID%5D = 1&安培;数据%5B5%5D%5BTitle%5D =平静+淀数据%5B5%5D %5BLengthSeconds%5D = 296&安培;数据%5B6%5D%5BID%5D = 6&安培;数据%5B6%5D%5BCDID%5D = 1&安培;数据%5B6%5D%5BTitle%5D =蓝色+天空和安培;数据%5B6%5D %5BLengthSeconds%5D = 307

...解码和播放的URL看起来像这样:

  

动作:除去

     

数据[4] [ID]:4

     

数据[4] [CDID]:1

     

数据[4] [标题]:白狼

     

数据[4] [LengthSeconds]:215

     

数据[5] [ID]:5

     

数据[5] [CDID]:1

     

数据[5] [标题]:平静的湖泊

     

数据[5] [LengthSeconds]:296

     

数据[6] [ID]:6

     

数据[6] [CDID]:1

     

数据[6] [标题]:蓝天

     

数据[6] [LengthSeconds]:307

我尝试了各种方法签名来尝试获取内容,例如:

    public void Delete([FromBody] Dictionary<string,object> myData)
    public void Delete([FromBody] Dictionary<string,string> myData)
    public void Delete([FromBody] string[] myData)
    public void Delete([FromBody] FormUrlEncodedContent myData)

myData始终为null或空,await Request.Content.ReadAsStringAsync()生成空字符串。

理想情况下,我希望将正文反序列化为一个对象数组,每个对象代表一个要删除的项目(上面示例中的3个项目)。

这是我的代码问题(我该如何修复)?

这是WebApi框架的问题(限制)吗?

这是DataTables的一个问题(一个错误)吗?

这是在客户端使用DataTables的方式的问题(必须采取哪些措施来纠正它)?

1 个答案:

答案 0 :(得分:0)

使用:

lastActivity

请注意:

public void Delete([FromBody] FormDataCollection myData) FormDataCollection,因此对于给定的示例,键将是&#34; action&#34;,&#34; data [4] [ID]&#34;, &#34;数据[4] [CDID]&#34;等

因为&#34; [ID]&#34;值是唯一感兴趣的项目(只需要标识要删除的项目,其余的可以忽略),可以执行以下操作将它们提取为可枚举:

IEnumerable<KeyValuePair<string, string>>