如何读取HttpRequest的主体,WCF

本文关键字:主体 WCF HttpRequest 何读取 读取 | 更新日期: 2023-09-27 18:18:41

我想读取一个WCF web服务接收到的HttpRequest的正文。

WCF web服务是这样的:

[ServiceContract]
public interface ITestRestService
{
    [OperationContract]
    [WebInvoke(Method = "POST",
        ResponseFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.Bare,
        UriTemplate = "/test")]
    string Test(Stream aStrm);
}

发送到此服务的客户端成功调用Test()方法,但aStrm抛出异常:

'aStrm.ReadTimeout' threw an exception of type 'System.InvalidOperationException'

我应该使用流来发送正文还是其他内容?

当合同的配置看起来像这样时,我可以将数据作为url的一部分发送:

    [WebInvoke(Method = "POST",
        ResponseFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.Bare,
        UriTemplate = "?s={aStr}")]
    string Test(string aStr);

但是这是常见的做法吗?我逻辑上不应该将内容添加到请求的正文而不是url吗?

我读过类似的问题,但我仍然不确定。

如何读取HttpRequest的主体,WCF

我同意您的观点,POST请求的正文是发送数据的更好的地方。尽管有些web服务确实通过url发送数据。除了语义之外,还有安全问题,如果敏感数据以url的形式发送,则可以以纯文本形式显示在管理日志中,等等。

除非你真的需要一个Stream来处理大量的数据,否则你可以创建一个模型类来传输数据。早期版本的ASP。NET Web API (WCF Web API的后继者)要求您为POST主体使用完整的类。

我想试试

public class PostData
{
    public string aStr { get; set; }
}

[WebInvoke(Method = "POST",
 ResponseFormat = WebMessageFormat.Json,
 BodyStyle = WebMessageBodyStyle.Bare,
 UriTemplate = "?s={aStr}")]
    string Test(PostData data);

这是一个参考,你可以使用WCF发布。他演示了通过模型发布JSON数据。http://blog.alexonasp.net/post/2011/05/03/REST-using-the-WCF-Web-API-e28093-POST-it ! . aspx