将数据发送到WCF RESTful服务时的HTTP 400错误请求 - 最大请求大小?

时间:2011-10-16 22:33:47

标签: wcf http

我有一个WCF方法接受任意二进制数据,服务将保存到文件系统上的文件中。这是WCF方法:

[OperationContract]
[WebInvoke( Method="PUT", UriTemplate="/products/{productId}/resources/{resourceName}")]
public void PutResource(String productId, String resourceName, Stream resource)

然而,每当我的客户端(WinForms HttpWebRequest装置)尝试发出此请求时,系统(IIS或WCF或链中的某些东西)都会响应HTTP 400 Bad Request并使用空体(内容长度设置为零)无论如何)。我在我的WCF方法上设置了一个断点,并且永远不会调用该方法,事实上,当我使用完全注释掉的方法调用相同的URI时,我得到了相同的错误。

我在我的IErrorHandler类中的ProvideFault方法中设置了另一个断点,但是从未调用过,这表明在调用WCF之前出现了问题。

我刚刚尝试了这个方法,但是使用较小的请求资源(一个文本流,3个字节长)并且实际上工作正常,似乎只要我使用大于几千字节的任何东西就会失败。

我想不出要改变什么才能让它发挥作用 - 有什么建议吗?

编辑:我正在使用WCF REST入门套件2,它使用了引擎盖下的CustomBinding,它似乎没有使用MaxReceivedMessageSize属性(默认为65536,但我的方法失败,请求超过几个KB)。

EDIT2:在重建我的项目并测试各种文件之后,似乎限制实际上是64KB。现在找出指定64KB限制的位置......

1 个答案:

答案 0 :(得分:2)

我解决了。这是我添加到我的WebServiceHost2子类中以修复问题的代码:

protected override void OnOpening() {
    base.OnOpening();

    foreach(ServiceEndpoint ep in base.Description.Endpoints) {

        if( ep.Binding is CustomBinding ) {

            CustomBinding cb = (CustomBinding)ep.Binding;

            foreach(BindingElement e in cb.Elements) {

                if( e is HttpTransportBindingElement ) {

                    HttpTransportBindingElement h = (HttpTransportBindingElement)e;
                    h.MaxReceivedMessageSize = Int32.MaxValue; // "2GB should be enough for anyone".
                }

            }

        }