我有一个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限制的位置......
答案 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".
}
}
}