none
Problemas con el buffer y el tamaño maximo del mensaje. RRS feed

  • Pregunta

  • Buenas tardes.

    Actualmente estoy desarrollando una aplicacion que utiliza Websercices, esta realizada en c# con .net 4.5, la cual tengo problemas de recepcion de unas fotos que envian desde un dispositivo movil hacia la aplicacion, ya que la recepcion toma hasta 2 dias enviando solamente 10 fotos, yo pienso que el problema puede ser la configuracion del Binding ya que el maxBufferPoolSize, maxBufferSize y el maxReceivedMessageSize estan configurados con su valor maximo lo cual no se si sea recomendable que es 2147483647 de bytes. me gustaria saber si me podrian ayudar con alguna recomendacion de el tamaño del buffer ademas del mensaje recibido, a continuacion adjunto la configuracion del binding gracias de antemano

    <binding name="secUP" 
        closeTimeout="00:10:00" openTimeout="00:10:00"    receiveTimeout="00:10:00" sendTimeout="00:10:00"
        maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
          <readerQuotas maxDepth="2147483647"
          maxStringContentLength="2147483647"
          maxArrayLength="2147483647"
          maxBytesPerRead="2147483647"
          maxNameTableCharCount="2147483647"/>
          <security mode="TransportCredentialOnly" >
            <transport clientCredentialType="Basic" />
          </security>
        </binding>
      </webHttpBinding>
    
    </bindings>
    miércoles, 12 de noviembre de 2014 22:33

Todas las respuestas

  • Si finalmente consigues recepcionar tus ficheros no creo que sea problema del tamaño del mensaje si no más bien de la comunicación de la red, si las fotos fueran más grandes que el tamaño del buffer no tardarían más o menos directamente no se enviarían.

    Mi recomendación es que para el envío de este tipo de ficheros no utilices un binding con un transporte en modo buffer, utiliza en este caso un transporte en modo streaming. (Streaming Message Transfer)

    Aquí puedes encontrara algo más de información al respecto: (Large Data and Streaming)

    Un saludo.


    Si se solucionó tu consulta, no olvides marcarla como respondida. Si te ayudó, vótala como útil.


    miércoles, 12 de noviembre de 2014 23:09
  • Muchas gracias Jose si logre hacer mejorar un poco aunque para mandar una foto de 600kb demora todavia demasiado no se si es por la forma como la estoy recibiendo me podrias dar algun consejo sobre si ahi una forma mas optima de realizarlo ya que asi funciona pero a mi parecer algo lento ya que la foto es enviada desde un dispositivo movil al wfc, adjunto el codigo

    public bool RecibirFoto(Stream str, string NombreFoto, string ProyectoId)
            {
                try
                {
                    NameValueCollection appRuta = WebConfigurationManager.AppSettings as NameValueCollection;
                    string path = appRuta["CarpetaImagenes"];
                    string Disco = appRuta["UnidadFoto"];
                    IRutaGuiaRepository r = RepositoryFactory.CreateRutaGuiaRepository();
                    int proyecto = Convert.ToInt32(ProyectoId);
                    MA_ProyectoDTO Proyecto = r.Find<MA_Proyecto>(x => x.ProyectoId == proyecto && x.Eliminado == false).FirstOrDefault().ToDTO();
                    r.Dispose();
                    if (Proyecto != null)
                    {
                        path = path + Proyecto.NombreProyecto + "/";
                    }
                    else
                    {
                        return false;
                    }
                    DriveInfo drive = new DriveInfo(Disco);
                    long EspacioDisponible = drive.AvailableFreeSpace;
                    byte[] buff = new byte[0x10000];
                    // save the file in chunks
                    if (!Directory.Exists(path))
                    {
                        DirectoryInfo Directorio = Directory.CreateDirectory(path);
                    }
                    if (!File.Exists(path + NombreFoto))
                    {
                        FileStream fs = new FileStream(path + NombreFoto, FileMode.Create);
                        int bytesRead = str.Read(buff, 0, buff.Length);
                        int TotalBytesRead = bytesRead + 104857600;
                        while (bytesRead > 0)
                        {
                            if (TotalBytesRead < EspacioDisponible)
                            {
                                fs.Write(buff, 0, bytesRead);
                                bytesRead = str.Read(buff, 0, buff.Length);
                                TotalBytesRead += bytesRead;
                            }
                            else
                            {
                                fs.Close();
                                fs.Dispose();
                                File.Delete(path + NombreFoto);
                                return false;
                            }
                        }
                        if (TotalBytesRead < EspacioDisponible)
                        {
                            fs.Close();
                            fs.Dispose();
                            return true;
                        }
                        else
                        {
                            fs.Close();
                            fs.Dispose();
                            File.Delete(path + NombreFoto);
                            return false;
                        }
                    }
                    else
                    {
                        return false;
                    }
                }
                catch (Exception e)
                {
                    LogUtil.instancia().ProcessLogEntry(e);
                    throw e;
                }
            }
    gracias de antemano

    jueves, 13 de noviembre de 2014 15:49
  • Buenas,

    El código que has subido hace referencia al método que recibe el stream que representa la fotografía y la almacena en el disco duro, lo que me hace plantearme cual es tu verdadero problema, es decir, el problema viene porque desde que envías la foto hasta que se ejecuta ese método pasa mucho tiempo, o el problema viene a la hora de que cuando ese método se ejecuta tarda mucho. Dicho de otra manera, el problema viene porque se tarda mucho en enviar la fotografía o en almacenarla en el disco duro?.

    Un saludo.


    Si se solucionó tu consulta, no olvides marcarla como respondida. Si te ayudó, vótala como útil.

    jueves, 13 de noviembre de 2014 22:02
  • muchas gracias por responder, el problema es que tarda mucho tanto en enviar y escribir la foto y lo raro es que la foto no pesa mucho no se si no esta bien optimizado la parte de los buffers o la forma como la estoy escribiendo en el disco no es la mas optima 

    gracias de antemano

    jueves, 13 de noviembre de 2014 22:32
  • aparte de lo comentado por José Luque y complementándolo te recomiendo pongas lo siguiente en el web.config del servicio.

    <System.web>
    <!-- allow large file uploads --> 
     <httpRuntime useFullyQualifiedRedirectUrl="true" maxRequestLength="65536″ requestLengthDiskThreshold="24576" executionTimeout="3600″/>
    </system.web>

    Los parámetros que añadimos o modificamos son:

    •maxRequestLength="65536″ --> Este valor indica el tamaño máximo de la petición en kilobytes (8192 para 8 Mb, 16384 para 16 Mb, 65536 para 64 Mb, y así...)


    •requestLengthDiskThreshold="24576" --> Especifica, en kilobytes, el umbral del almacenamiento en búfer del flujo de entrada. Este valor no debe superar el valor del atributo maxRequestLength.


    •executionTimeout="3600″ --> Especifica, en segundos, el tiempo máximo durante el cual una solicitud puede ejecutarse antes de que ASP.NET la cierre automáticamente.Este tiempo de espera sólo se aplica si el atributo de depuración del elemento compilation tiene el valor False. Si el atributo debug es True, para ayudar a evitar que se cierre la aplicación mientras realiza la depuración, no establezca este tiempo de espera en un valor alto


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    jueves, 13 de noviembre de 2014 22:56
    Moderador
  • Te recomiendo que uses MTOM en el modo de transporte de la información. Este permite trabajar con archivos grandes como es el caso de las fotos.
    miércoles, 17 de diciembre de 2014 16:43