2011-01-10 11 views
5

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.)

+0

nos muestra la configuración del servidor, las configuraciones en el cliente deben estar en el servidor para 'solicitud'. – leppie

+0

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? –

Respuesta

5

Así que encontré el problema - bindingName="StreamedRequestWebBinding" debería ser bindingConfiguration="StreamedRequestWebBinding". Con el primero, mi configuración de enlace especificada no se usaba en absoluto, por lo que maxReceivedMessageSize tenía un valor predeterminado de 64kB.

0

hay un archivo ServiceReferences.ClientConfig en su aplicación Silverlight, así, se debe actualizar la maxBufferSize y maxReceivedMessageSize en esa configuración.

+0

Esto no está utilizando una referencia de servicio, esto es hacer una solicitud HTTP sin procesar usando WebRequest.Create como se muestra en el código. De hecho, puedo mover el código de cliente de mi aplicación Silverlight a una consola simple y lograr el mismo resultado. –

Cuestiones relacionadas