WCF数据服务:如何使用大主体调用POST操作

本文关键字:主体 调用 POST 操作 何使用 数据 服务 WCF | 更新日期: 2023-09-27 18:15:20

如何从WCF服务客户端调用WCF数据服务操作?

我的服务上有这个操作:

[WebInvoke(Method="POST")]
public void Add(int ContractId, string Partners)
{
    ...
}

如何从客户端调用此操作?我的客户端是一个基于c#的应用。记住,合伙人的字符串非常非常长。它是伙伴id的串联,例如:"1,2,3,4,…"990"。

我已经试过了:

        string requestString = string.Format("Add?contractId={0}&Partners={1}",  ContractId, groupIdParam);
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(serviceUrl +
            requestString);
        request.Method = "POST";
        var response = request.GetResponse();

但我收到错误:"HTTP 414:请求Uri太长"

WCF数据服务:如何使用大主体调用POST操作

目前OData不支持在POST请求体中传递服务操作的参数(这就是WebInvoke方法)。所有参数都在URL中传递,因此它们必须非常小(通常小于2048个字符,取决于您的web服务器,代理等)。

实际上,您没有执行post请求。POST请求在请求体中提供信息,这就是为什么它特别用于大型数据集的原因。您必须在请求体中同时提供contractIdpartners。您可以使用HttpWebRequest.GetRequestStream()方法获得一个流,然后向其写入参数。

此链接http://en.wikipedia.org/wiki/POST_(HTTP)描述了用于在请求体中指定名称-值对的结构。

所以你可以这样写(未经测试):
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(serviceUrl + "Add");
using (Stream bodyStream = request.GetRequestStream())
using (StreamWriter writer = new StreamWriter(bodyStream))
{
    writer.Write("contractId: {0}", contractId);
    writer.Write("partners: {0}", String.Join(",", partners);
}
request.GetResponse();

编辑正如Vitek Karas所说,这是不可能的。