使用 Fiddler 时,Rest WCF Post Json 正文参数始终为空
Posted
技术标签:
【中文标题】使用 Fiddler 时,Rest WCF Post Json 正文参数始终为空【英文标题】:Rest WCF Post Json body parameter is always null while using Fiddler 【发布时间】:2013-05-01 12:12:51 【问题描述】:过去几天我一直在为此苦苦挣扎。我已经研究了这个问题并尝试了发布的解决方案。然而它没有奏效。我有具有
的 REST WCF Post 方法 [OperationContract(Name = "ImportRawJson")]
WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest,
ResponseFormat = WebMessageFormat.Json, RequestFormat=WebMessageFormat.Json,
UriTemplate = "ImportRawJson/username/username/password/password/fileName/fileName")]
string ImportRawJson(string username, string password, string fileName, string jsonStream);
我可以通过网络客户端使用它。但是,当我尝试通过 Fiddler 调用时,如下面的 body 参数总是导致 null 并且我得到一个异常。
提琴手:
发布 http://localhost
/TimesheetService/Timesheet.svc/ImportRawJson/username/user/password/pwd/fileName/testfiddler
请求标头: 用户代理:提琴手 主机:本地主机 内容长度:32 内容类型:应用程序/json;字符集=utf-8
请求正文: "jsonStream": "ImportRaw": "TestXml": "xml": "test"
错误: HTTP/1.1 400 错误请求 缓存控制:私有 内容长度:127 内容类型:应用程序/json;字符集=utf-8 服务器:Microsoft-IIS/7.5 X-AspNet-版本:4.0.30319 设置 Cookie:ASP.NET_SessionId=wh4qxcu1x0vmiv45mmzuuaup;路径=/; HttpOnly X-Powered-By: ASP.NET 日期:格林威治标准时间 2013 年 5 月 7 日星期二 14:00:58
"ErrorCode":"Error","Message":"过程或函数需要参数'jsonStream',但未提供。"
关于如何传递 body 参数的任何帮助。我真的很感激。我被困在这一点上。请帮忙!!提前致谢
【问题讨论】:
第 1 步:使用 Fiddler 捕获来自 WebClient 的请求。第 2 步:使用 Fiddler 的 Composer 发送与 WebClient 发送的完全相同的请求。完成。 @EricLaw:我确实尝试了您提到的步骤,但我收到 Bad Request 错误:HTTP/1.1 400 Bad Request 提到“服务器在处理请求时遇到错误。异常消息是'The格式化程序在尝试反序列化消息时抛出异常:尝试反序列化参数 localhost:jsonStream 时出错。InnerException 消息是“反序列化 System.String 类型的对象时出错。命名空间中的结束元素 'jsonStream'” ' 预期。从命名空间 ''.' 中找到元素 'ImportRaw'。“ @EricLaw:感谢您的回复。我觉得我在参数中发送的jsonstring不对,我在这里缺少什么?我已经尝试了所有各种操作。请帮帮我。 如果您按照我提供的步骤进行操作,您将捕获 Web 客户端生成的格式正确的工作请求。然后,您可以使用来自 Composer 的工作请求。 【参考方案1】:您的代码中有几个问题。首先,如果“JSON 流”是指任何 JSON 文档,则您将无法在代码中使用 string
类型。相反,您需要将其视为Stream
(它基本上可以接受任何任意输入)。如果将输入作为字符串,则应将 JSON 字符串传递给它。并且由于您将主体类型设置为WrappedRequest
,因此您需要将 JSON 字符串包装在一个对象中,其中 参数名称 是成员名称,而您要传递给函数的值是价值。例如,要将字符串 hello world
传递给您的操作,您需要传递此请求正文:
"jsonStream":"hello world"
但如果我猜对了,并且您想获取任意 JSON,则需要使用 Stream
参数。 http://blogs.msdn.com/b/carlosfigueira/archive/2008/04/17/wcf-raw-programming-model-receiving-arbitrary-data.aspx 的博文有更多关于如何实现它的信息。
【讨论】:
@Carlosfigueria:非常感谢!!是的,我愿意接受 JSON 文档。链接对我帮助很大。我已将其标记为已回答。但是,我还需要为另一个具有类似签名的方法调用接受一个 json 字符串。并且使用 "jsonStream":"hello world",我总是遇到空值异常。请帮帮我。 找出问题所在。感谢您指出正确的方向。以上是关于使用 Fiddler 时,Rest WCF Post Json 正文参数始终为空的主要内容,如果未能解决你的问题,请参考以下文章
当 Fiddler 运行 .Net 4.5 时,WCF 服务正在工作