【问题标题】:XML deserialization from request body in ASP.NET MVCASP.NET MVC 中请求正文的 XML 反序列化
【发布时间】:2018-04-24 17:15:05
【问题描述】:

我正在尝试设置一个 MVC 应用程序,该应用程序具有一个在请求正文中接受 XML 的端点,然后对其进行处理。我已经对此进行了简化以尝试缩小问题范围,所以这是我的模型:

Public Class MyModel
    Public Property Value1 As String
    Public Property Value2 As String
End Class

我的控制器中有这个设置:

<HttpPost()> _
Public Function Launch(<FromBody()> ByVal myModel As MyModel) As ActionResult
    ' ...
    ' myModel is always a new object but with null properties
    ' ...
End Function

这是我发送的 HTTP 请求:

POST /launch HTTP/1.1
Host: example.com
Accept: application/xml
Content-Type: application/xml

<MyModel>
    <Value1>1</Value1>
    <Value2>2</Value2>
</MyModel>

当我调试时,它会到达正确的端点,但 myModel 始终为空。空我的意思是对象已经被实例化,但它的所有属性都是null

我已经在 stackoverflow 上搜索了所有答案,但没有任何效果。我在Global.asax 代码中添加了config.Formatters.XmlFormatter.UseXmlSerializer = True,但这似乎不起作用。我还添加了一个自定义 XmlMediaTypeFormatter,它忽略了似乎也没有任何作用的 xml 命名空间。

有什么明显我遗漏的东西吗?我知道我使用的是 VB.NET,而且我看到的所有示例都是 C#,所以可能在翻译中丢失了一些东西。在这一点上,我很难理解为什么这很难做到。

【问题讨论】:

  • 嗯...也许您在 XML 帖子中缺少数据协定/xmls 属性? &lt;MyModel xmlns="http://schemas.datacontract.org/2004/07/AppName.NameSpaceName"&gt; ... &lt;/MyModel&gt;
  • 刚刚找到了这个可靠的 SO 答案——我认为提供的选项可能值得一试:stackoverflow.com/a/14069824/7902641
  • @TylerCrawford 是的,在我发布我的问题之前,我遇到了这个答案。我已经尝试了所有这些选项,但都没有奏效:\
  • 我的一个建议是使用“网络嗅探器”程序(例如 Fiddler)检查您传输的实际内容。你的“身体”很可能是错误的。 更新:只有当您的客户端是浏览器时,Fiddler 才能做到这一点。否则你需要更复杂的东西,比如 Wireshark。
  • @johannes.colmsee 我正在使用 Postman 发送请求,所以我确切地知道正文中的内容。我还仔细检查了 Fiddler,它看起来是正确的。

标签: c# xml asp.net-mvc vb.net


【解决方案1】:

问题是因为我的控制器类型为System.Web.Mvc.Controller 而不是System.Web.Http.ApiController。 MVC 控制器没有 WebAPI 控制器所具有的反序列化能力,因此期望 JSON 数据或 HTML 表单数据作为有效负载。将控制器的类更改为System.Web.Http.ApiController 后,它起作用了。

【讨论】:

    猜你喜欢
    • 2019-07-23
    • 2020-05-12
    • 1970-01-01
    • 2020-06-02
    • 2019-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多