在 REST WCF 中读取 HttpRequest 正文

Posted

技术标签:

【中文标题】在 REST WCF 中读取 HttpRequest 正文【英文标题】:Reading HttpRequest Body in REST WCF 【发布时间】:2011-03-04 06:26:09 【问题描述】:

我有一个在 .net 4 中运行的 REST WCF 服务,并且我已经测试了它正在运行的 Web 服务并接受了我向它发出的 HttpRequest。但是我在尝试访问 Web 服务中的 HttpRequest 正文时遇到了问题。我尝试使用 Fiddler 和我的 WinForm 应用程序发送附加在 HttpRequest 上的随机数据大小,但我似乎无法在运行时找到任何可以找到我的请求正文所在的对象。我最初的直觉是查看HttpContext.Current.Request.InputStream,但该属性的长度为0,因此我尝试查看IncomingWebRequestContext,该对象甚至没有获取HttpRequest主体的方法或属性。

所以我的问题是,真的有办法在 WCF 中访问 HttpRequest 请求正文吗?

PS: 请求正文中的数据是 JSON 字符串,对于响应,它也会将响应正文中的数据作为 JSON 字符串返回。

【问题讨论】:

【参考方案1】:

简单得多,WCF + REST: Where is the request data? 上的这个答案可以正常工作。

另外,如果您的请求正文是可反序列化的,您可以只传递一个类。除非有一些错别字,否则应该可以:

public class Banana

    public string Colour;
    public int Size;

...

[WebInvoke(
    Method = "POST", 
    UriTemplate = "bananas", 
    ResponseFormat=WebMessageFormat.Json, 
    RequestFormat=WebMessageFormat.Json)]
string CreateBanana(Banana banana);

...

public string CreateBanana(Banana banana)

    return "It's a " + banana.Colour + " banana!";

使用数据 "Colour": "blue", "Size": 5 对此资源执行 POST 应返回 "It's a blue banana!"

【讨论】:

【参考方案2】:

试试((System.ServiceModel.Channels.BufferedMessageData)(((System.ServiceModel.Channels.BufferedMessage)((OperationContext.Current.RequestContext).RequestMessage)).MessageData)).Buffer

它的类型为System.ArraySegment<byte>

或阅读WCF + REST: Where is the request data?

【讨论】:

这是针对 .Net Framework 4.0 的吗?因为我在 System.ServiceModel.Channels 命名空间中找不到 BufferedMessageData 和 BufferedMessage 我在 .Net Framework 4.0 WCF 项目的调试器(监视窗口)中使用了它。 我什至已经将 System.ServiceModel 引用添加到我的项目中,但我仍然无法在 System.ServiceModel.Channels 中找到 BufferedMessageData 对象。我也尝试在对象浏览器中搜索它,但根本没有结果。 您应该在调试器的“非公共成员”部分搜索。如果您想编写代码来访问数据,您应该获取System.ServiceModel.OperationContext.Current.RequestContext.RequestMessage 作为System.ServiceModel.Channels.Message 类型的实例,然后按照***.com/questions/1850293/… 中描述的方式访问一些“非公共成员”。

以上是关于在 REST WCF 中读取 HttpRequest 正文的主要内容,如果未能解决你的问题,请参考以下文章

WCF + REST,增加 MaxStringContentLength

如何在 C# 中正确使用 WCF REST API 上的 Stream 将文件(图像/视频/等)上传到服务器?

WCF REST 服务模板 40(CS) 跨域错误

如何在 WCF 服务中调用 REST API?

在 WCF 中使用 REST GET 作为第二个端点

WCF 4.0 REST 用户名密码认证