使用 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 正文参数始终为空的主要内容,如果未能解决你的问题,请参考以下文章

从 jquery 调用 wcf rest 服务不起作用

为 Rest Web 服务创建 WCF 代理

当 Fiddler 运行 .Net 4.5 时,WCF 服务正在工作

WCF + REST,增加 MaxStringContentLength

Fiddler 不捕获 WCF 流量但捕获 ASMX 很好

在 wcf rest 服务 C# 中使用 Stream 作为输入时缺少第一个元素