gpt4 book ai didi

c# - 通过 application/x-www-form-urlencoded 反序列化时不使用 WebAPI DataMember 名称

转载 作者:太空狗 更新时间:2023-10-29 17:47:58 24 4
gpt4 key购买 nike

在处理 HTTP POST 表单请求(Content-Type: application/x- www-form-urlencoded).

我有 Microsoft.AspNet.WebApi 5.2.3 应用程序在 .NET 4.5 上运行,由 IIS 托管。

我有这个模型(演示):

// library
public interface IPayload
{
string DataId { get; set; }
int RelationId { get; set; }
}

// web app project
[DataContract]
public class MyPayload : IPayload
{
[Required]
[DataMember(Name = "id")]
public string DataId { get; set; }

[Required]
[DataMember(Name = "rel")]
public int RelationId { get; set; }
}

然后我有 Controller :

[HttpPost]
[Route("~/api/stuff")]
public async Task<HttpResponseMessage> DoMagic(MyPayload payload)
{
// ... breakpoint
}

(注意我真的在使用模型类型,而不仅仅是我 Controller 中的接口(interface))


当我像这样发送数据时:

curl -X POST --data '{"id":"foo","rel":1}' -H "Content-Type: application/json" -H "Content-Length: 20" http://localhost/api/stuff

我正确地反序列化了我的模型。


但是,当我这样做时:

curl --data "id=foo" --data "rel=1" http://localhost/api/stuff

...我得到空模型 - 自定义名称被忽略,所有属性都有默认值。

最后,当我这样请求时:

curl --data "DataId=foo" --data "RelationId=1" http://localhost/api/stuff

...模型已正确序列化。


所以我想知道,我做错了什么。我花了很多时间阅读,我发现的大多数案例都是关于缺少 DataContractAttribute 的,它存在于我的案例中。

Controller 参数前面的属性 FromBody 也没有改变任何东西。

在我的应用程序中,这些格式化程序已注册:

  • System.Net.Http.Formatting.JsonMediaTypeFormatter
  • System.Net.Http.Formatting.XmlMediaTypeFormatter
  • System.Net.Http.Formatting.FormUrlEncodedMediaTypeFormatter
  • System.Web.Http.ModelBinding.JQueryMvcFormUrlEncodedFormatter

SupportedMediaTypes 中只有最后两个包含 application/x-www-form-urlencoded

最佳答案

耗时的调试,我必须自己回答。

System.Net.Http.Formatting.FormUrlEncodedMediaTypeFormatter 未使用,因为我的模型不是从 FormDataCollection 派生的,也不是 JS token 类型。所以格式化程序 System.Web.Http.ModelBinding.JQueryMvcFormUrlEncodedFormatter 正在使用中。

CompositeModelBinder 中使用的绑定(bind)器是:

  • TypeMatchModelBinder(跳过)
  • MutableObjectModelBinder(已使用)

我还没有找到任何代码痕迹,这将考虑 DataMemberAttributeName 属性 - 所以我必须实现自己的 IModelBinder 对于我的类型,它将负责定制。

请注意:在序列化对象时,一切都按预期进行 - 上述问题仅与从请求主体反序列化有关。

来源

我希望我没有错过任何东西。如果是这样,请纠正我。

关于c# - 通过 application/x-www-form-urlencoded 反序列化时不使用 WebAPI DataMember 名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29925674/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com