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.)
zeigen Sie uns die Serverkonfiguration, diese Einstellungen im Client müssen auf dem Server für "Anfrage" sein. – leppie
Dies ist die Serverkonfiguration. Es gibt keine Konfiguration auf dem Client - ich baue nur eine rohe HTTP-Anfrage. Oder verstehe ich dich nicht? –