4

鉴于以下 ASP.NET WebAPI,我正在尝试使用 Fiddler 发送测试 POST,但无法使其正常工作。无论我发送什么,我总是只看到No data sent to service消息。

Imports System.Web.Http
Imports System.Net.Http
Imports System.Net

Namespace HelloWebApiDemo

    Public Class MyApiController
        Inherits ApiController

        Public Function [Get]() As HttpResponseMessage
            Return Request.CreateResponse(HttpStatusCode.OK, "Hello")
        End Function

        Public Class MyXmlData
            Public Property UserName As String
            Public Property Password As String
            Public Property SomeData As String
        End Class

        Public Function Post(<FromBody> x As MyXmlData) As HttpResponseMessage
            If x Is Nothing Then
                Return Request.CreateResponse(HttpStatusCode.InternalServerError, "No data sent to service")
            End If
            Dim u As String = String.Empty
            Dim p As String = String.Empty
            Dim d As String = String.Empty
            If Not String.IsNullOrEmpty(x.UserName) Then
                u = x.UserName
            End If
            If Not String.IsNullOrEmpty(x.Password) Then
                p = x.Password
            End If
            If Not String.IsNullOrEmpty(x.SomeData) Then
                d = x.SomeData
            End If
            Return Request.CreateResponse(HttpStatusCode.OK, String.Format("You posted {0}, {1} with a string that is {2} characters in length", u, p, d.Length.ToString))
        End Function

    End Class

End Namespace

在 Fiddler 中,我的 POST 如下所示:

在此处输入图像描述

谁能告诉我我做错了什么?我曾经Content-Type: text/xml希望 ASP.NET 能够正确地破译它。

更新

新屏幕抓取以下输入:

在此处输入图像描述

4

4 回答 4

3

保留Content-Type: text/xml请求标头并将 XML 更改为这样。

<MyApiController.MyXmlData
    xmlns:i="http://www.w3.org/2001/XMLSchema-instance"    
    xmlns="http://schemas.datacontract.org/2004/07/HelloWebApiDemo.HelloWebApiDemo">  
        <Password>somepassword</Password>
        <SomeData>somedata</SomeData>
        <UserName>bob</UserName>
</MyApiController.MyXmlData>
于 2013-09-27T16:28:56.440 回答
1

对于那些在遇到相同问题时有能力做到这一点的人,另一种选择是使用 JSON。我是 XML 的忠实粉丝,但不幸的是,在这种情况下,似乎与 XML 的使用相比,情况要复杂得多,因为在这种情况下,标准 WebApi 解析器需要所有可怕的额外内容,包括对后端命名空间和类型的深入了解,以及完整的 XML 规范命名空间(* 请参见下面的咆哮)。

{
  "SomeData": "R2D2",
  "UserName": "Johny",
  "Password": "password",
  "Num": 1013,  
  "IsCool": true
}

*( 咆哮,如果你想请忽略:为什么需要这个,哦,制作WepApi和其他此类框架的好先生?为什么不让XML被解放,自由接收而没有所有这些“丑陋”?如果包含,它可以仍然指定一些有用的东西,如果需要的话,但是为什么我们其他人必须包括这种丑陋?似乎事情已经(任意,尽管可能更多是出于历史包袱的原因,对不起,你可怜的 XML 生物,你被昨天的包袱困住了尽管不需要)与 XML 的使用相冲突,包括这样,即使有这一切,标准解析器也可能不允许您将 XML 的值作为 XML 属性发布。)

于 2014-08-06T16:45:55.167 回答
1

成功反序列化的最终 XML 片段:

<MyApiController.MyXmlData 
    xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://schemas.datacontract.org/2004/07/_WebApplication1.HelloWebApiDemo">
    <Password>Password</Password>
    <SomeData>Data here</SomeData>
    <UserName>Some Username</UserName>
</MyApiController.MyXmlData>

_WebApplication1是解决方案的名称。那一定是缺少的。

于 2013-10-01T09:31:28.100 回答
0

您可以使用DataContract属性设置命名空间将实体类标记为空字符串:

<DataContract(Namespace := "")>
Public Class MyXmlData
End Class

之后,不再需要 xmlns 参数。

于 2015-03-31T14:16:00.203 回答