如何使用Fiddler将XML发布到ASP.NET WebAPI

如何使用Fiddler将XML发布到ASP.NET WebAPI,asp.net,asp.net-web-api,Asp.net,Asp.net Web Api,鉴于以下ASP.NETWebAPI,我试图使用Fiddler发送一个测试帖子,但无法使其正常工作。无论我发送什么,我总是看到“无数据发送到服务”消息 Imports System.Web.Http 导入System.Net.Http 导入系统.Net 命名空间HelloWebApiDemo 公共类MyApiController 继承ApiController 公共函数[Get]()作为HttpResponseMessage Return Request.CreateResponse(HttpSt

鉴于以下ASP.NETWebAPI,我试图使用Fiddler发送一个测试帖子,但无法使其正常工作。无论我发送什么,我总是看到“无数据发送到服务”消息

Imports System.Web.Http
导入System.Net.Http
导入系统.Net
命名空间HelloWebApiDemo
公共类MyApiController
继承ApiController
公共函数[Get]()作为HttpResponseMessage
Return Request.CreateResponse(HttpStatusCode.OK,“Hello”)
端函数
公共类MyXmlData
公共属性用户名作为字符串
作为字符串的公共属性密码
公共属性SomeData作为字符串
末级
公共函数Post(x为MyXmlData)作为HttpResponseMessage
如果x什么都不是
返回请求.CreateResponse(HttpStatusCode.InternalServerError,“没有数据发送到服务”)
如果结束
尺寸u为String=String.Empty
Dim p As String=String.Empty
尺寸d为String=String.Empty
如果不是String.IsNullOrEmpty(x.UserName),则
u=x.UserName
如果结束
如果不是String.IsNullOrEmpty(x.Password),则
p=x.密码
如果结束
如果不是String.IsNullOrEmpty(x.SomeData),则
d=x.SomeData
如果结束
Return Request.CreateResponse(HttpStatusCode.OK,String.Format(“您发布的{0},{1}字符串长度为{2}个字符”,u,p,d.length.ToString))
端函数
末级
结束命名空间
在Fiddler中,我的帖子如下:

谁能告诉我我做错了什么?我使用了
内容类型:text/xml
,希望ASP.NET能够正确地破译它

更新

新屏幕抓取以下输入:


保留
内容类型: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>

密码
一些数据
上下快速移动

成功反序列化的最终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>

密码
这里的数据
一些用户名

\u WebApplication1
是解决方案的名称。这肯定是我们所缺少的。

对于那些有能力在面临相同问题时做到这一点的人来说,另一个选择是使用JSON。我是XML的超级粉丝,但不幸的是,在这种情况下,XML的使用似乎要困难得多,因为在这种情况下,标准WebApi解析器需要所有可怕的额外东西,包括对后端名称空间和类型的深入了解,以及完整的XML规范名称空间(*见下文)


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

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


公共类MyXmlData
末级

之后,就不需要使用xmlns参数了。

我不确定,但可能您的请求正文没有被序列化,因为序列化程序是区分大小写的?请尝试使用而不是和。仅供参考…内容类型
text/xml
很好,因为xml格式化程序将此作为其支持的媒体类型集合的一部分。抱歉,我是说保留
内容类型:text/xml
,因为OP已经提交了正确的媒体类型。编辑了上面的答案。很抱歉延迟回复。谢谢你的建议。我已经尝试过了,但仍然收到相同的错误;
没有数据发送到服务
。更新了问题以显示屏幕抓图。它应该可以工作,但不行。因此,有些人hing应该已经更改。我将向您展示一种为您的设置找到正确XML的简单方法。只需从GET方法返回
MyXmlData
对象,并使用
Accept:application\XML
请求头进行GET。这将返回您的
MyXmlData
的XML表示形式。如果您将相同的XML发回,它必须是nd正确。哈哈,是的,我不敢相信我没有想到这一点。它就像一个符咒-谢谢:-)我将在下面的答案中发布正确的XML,希望它能帮助其他人。再次感谢。哇,真是太可怕了!这样一来,一个移动应用程序代码库就必须对其后端的结构和名称空间(等等)有内部了解,此外,所有这些额外的漏洞对核心来说也是丑陋的。同时JSON不需要这些,可以发布简单的键值。我是XML的忠实粉丝,但我觉得事情与XML的使用背道而驰。我认为不一定要这样。无论如何,谢谢你的帖子。这实际上是通过正确使用Web服务自动生成的,而不是像我在Fiddler中使用的那样“使用”。在ASP.NET(或其他)中消费会很好地创建这个XML。WebAPI正因为这个而受到关注。我要明确一点,您是说WebAPI实际上可以使用普通的旧XML(没有完整的模式和名称空间名称等)吗?我在发现我的WebApi端点可以像我上面给出的那样接收JSON后写了这篇评论,简单明了,但它拒绝了XML。是的,但在WebApi POST/PUT中传递JSON更好,因为它更轻量级,并且根本不需要头。我只是在学习WebApi
<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>
{
  "SomeData": "R2D2",
  "UserName": "Johny",
  "Password": "password",
  "Num": 1013,  
  "IsCool": true
}