Tengo un servicio de WCF que lleva una corriente:Transmisión de datos binarios a un servicio WCF resto da Bad Request (400) cuando la longitud del contenido excede 64k
[ServiceContract]
public class UploadService : BaseService
{
[OperationContract]
[WebInvoke(BodyStyle=WebMessageBodyStyle.Bare, Method=WebRequestMethods.Http.Post)]
public void Upload(Stream data)
{
// etc.
}
}
Este método es permitir que mi aplicación Silverlight para cargar binario grande archivos, la forma más fácil es crear la solicitud HTTP a mano del cliente. Aquí está el código en el cliente de Silverlight que hace esto:
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());
}
Ahora, en el caso anterior, donde estoy Transmisión de 64 KB de datos (o menos), esto funciona bien y si me puse un punto de interrupción en mi método WCF, y puedo examinar la secuencia y ver un valor de 64 kB en ceros - ¡yay!
El problema surge si envío algo más de 64 KB de datos, por ejemplo, cambiando la primera línea de mi código de cliente a lo siguiente:
const int contentLength = 64 * 1024 + 1; // 64 kB + 1 B
Esto ahora se produce una excepción en el cliente cuando llamo request.GetResponse():
The remote server returned an error: (400) Bad Request.
En la configuración del servidor de WCF he puesto maxReceivedMessageSize, MaxBufferSize y maxBufferPoolSize al 2147483647, pero fue en vano. Aquí están las secciones pertinentes de app.config de mi servicio:
<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>
¿Cómo hago mi servicio aceptar más de 64 KB de datos de correos streaming?
Editar: como se muestra en el código de cliente anterior, no estoy usando referencias de servicio, sino construyendo la solicitud HTTP a mano. (Esto se debe a las referencias de servicios de Silverlight no soportan corrientes.)
nos muestra la configuración del servidor, las configuraciones en el cliente deben estar en el servidor para 'solicitud'. – leppie
Esta es la configuración del servidor. No hay configuración en el cliente: solo estoy construyendo una solicitud HTTP sin procesar. ¿O no te estoy entendiendo? –