2011-01-10 7 views
5

ich einen WCF-Dienst, die einen Stream nimmt:Streaming Binärdaten WCF Rest Service bietet Bad Request (400), wenn der Inhalt Länge 64k überschreitet

[ServiceContract] 
public class UploadService : BaseService 
{ 
    [OperationContract] 
    [WebInvoke(BodyStyle=WebMessageBodyStyle.Bare, Method=WebRequestMethods.Http.Post)] 
    public void Upload(Stream data) 
    { 
     // etc.   
    } 
} 

Diese Methode ist, damit meine Silverlight-Anwendung große binäre hochladen Dateien, der einfachste Weg ist, die HTTP-Anfrage von Hand vom Client zu erstellen. Hier ist der Code in dem Silverlight-Client, der tut dies:

const int contentLength = 64 * 1024; // 64 Kb 

var request = (HttpWebRequest)WebRequest.Create("http://localhost:8732/UploadService/"); 
request.AllowWriteStreamBuffering = false; 
request.Method = WebRequestMethods.Http.Post; 
request.ContentType = "application/octet-stream"; 
request.ContentLength = contentLength; 
using (var outputStream = request.GetRequestStream()) 
{ 
    outputStream.Write(new byte[contentLength], 0, contentLength); 
    outputStream.Flush(); 
    using (var response = request.GetResponse()); 
} 

nun in dem obigen Fall, wo ich 64 kB Daten bin Streaming (oder weniger), das funktioniert OK und wenn ich einen Haltepunkt gesetzt in meiner WCF-Methode, und ich kann den Strom untersuchen und 64 kB Nullen sehen - yay!

Das Problem entsteht, wenn ich durch eine Änderung der ersten Zeile meines Client-Code auf die folgende etwas mehr als 64 kB Daten, zum Beispiel an:

const int contentLength = 64 * 1024 + 1; // 64 kB + 1 B 

Diese jetzt löst eine Ausnahme auf dem Client wenn ich rufe request.GetResponse():

The remote server returned an error: (400) Bad Request.

in der WCF-Konfiguration des Servers habe ich MaxReceivedMessageSize, MaxBufferSize und MaxBufferPoolSize bis 2147483647, aber ohne Erfolg eingestellt. Hier sind die entsprechenden Abschnitte aus meinem Dienst des app.config:

<service name="UploadService"> 
    <endpoint address="" 
       binding="webHttpBinding" 
       bindingName="StreamedRequestWebBinding" 
       contract="UploadService" 
       behaviorConfiguration="webBehavior"> 
     <identity> 
      <dns value="localhost" /> 
     </identity> 
    </endpoint> 
    <host> 
     <baseAddresses> 
      <add baseAddress="http://localhost:8732/UploadService/" /> 
     </baseAddresses> 
    </host>  
</service> 

<bindings> 
    <webHttpBinding> 
     <binding name="StreamedRequestWebBinding" 
       bypassProxyOnLocal="true" 
       useDefaultWebProxy="false" 
       hostNameComparisonMode="WeakWildcard" 
       sendTimeout="00:05:00" 
       openTimeout="00:05:00" 
       receiveTimeout="00:05:00" 
       maxReceivedMessageSize="2147483647" 
       maxBufferSize="2147483647" 
       maxBufferPoolSize="2147483647" 
       transferMode="StreamedRequest"> 
      <readerQuotas maxArrayLength="2147483647" 
          maxStringContentLength="2147483647" /> 
     </binding> 
    </webHttpBinding> 
</bindings> 

<behaviors> 
    <endpointBehaviors> 
     <behavior name="webBehavior"> 
      <webHttp /> 
     </behavior> 
    <endpointBehaviors> 
</behaviors> 

Wie mache ich meinen Dienst mehr als 64 kB von gestreamten Post-Daten akzeptieren?

Bearbeiten: wie im obigen Client-Code gezeigt, verwende ich nicht Service-Referenzen, sondern Bau der HTTP-Anfrage von Hand. (Dies liegt daran, dass Silverlight-Dienstreferenzen keine Streams unterstützen.)

+0

zeigen Sie uns die Serverkonfiguration, diese Einstellungen im Client müssen auf dem Server für "Anfrage" sein. – leppie

+0

Dies ist die Serverkonfiguration. Es gibt keine Konfiguration auf dem Client - ich baue nur eine rohe HTTP-Anfrage. Oder verstehe ich dich nicht? –

Antwort

5

So fand ich das Problem - bindingName="StreamedRequestWebBinding" sollte bindingConfiguration="StreamedRequestWebBinding" sein. Bei der ersten wurde meine angegebene verbindliche Konfiguration überhaupt nicht verwendet, daher wurde maxReceivedMessageSize auf 64 KB voreingestellt.

0

In Ihrer Silverlight-App befindet sich auch eine ServiceReferences.ClientConfig Datei. Sie sollten die maxBufferSize und maxReceivedMessageSize in dieser Konfiguration aktualisieren.

+0

Dies ist keine Service-Referenz - dies ist eine rohe HTTP-Anfrage mit WebRequest.Create wie im Code gezeigt. Tatsächlich kann ich den Client-Code aus meiner Silverlight-App in eine einfache Konsole verschieben und das gleiche Ergebnis erzielen. –

Verwandte Themen